1. 程式人生 > >Redis常用命令對應的Spring中RedisTemplate操作方法

Redis常用命令對應的Spring中RedisTemplate操作方法

1、Spring配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	
	<!-- 配置jedisPoolConfig -->
	<bean id ="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxIdle" value="50"></property>
		<property name="maxTotal" value="100"></property>
		<property name="maxWaitMillis" value="20000"></property>
	</bean>
	<!-- 配置JedisConnectionFactory -->
	<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<property name="hostName" value="your own hostname dude"></property>
		<property name="port" value="6379"></property>
		<property name="poolConfig" ref="poolConfig"></property>
	</bean>
	<!-- 配置SpringRedisTemplate -->
	<!-- 配置序列化規則 -->
	<bean id="jdkServializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
	<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
		<property name="connectionFactory" ref="connectionFactory"></property>
		<property name="keySerializer" ref="stringRedisSerializer"></property>
		<property name="valueSerializer" ref="stringRedisSerializer"></property>
	</bean>
</beans>

該檔案簡單配置了redis連線池、連線工廠、序列化規則(根據不同的資料型別修改)和RedisTemplate

2、redis客戶端測試:

3、使用Spring測試Redis字串操作

@Test
	public void redisTemplate1(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
		RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
		//設值
		redisTemplate.opsForValue().set("key1", "value1");
		redisTemplate.opsForValue().set("key2", "value2");
		//通過key獲取值
		String value1= (String) redisTemplate.opsForValue().get("key1");
		System.out.println(value1);
		redisTemplate.delete("key1");
		//求長度
		Long length = redisTemplate.opsForValue().size("key2");
		System.out.println(length);
		//設定新值並返回舊值
		String oldValue2 = (String) redisTemplate.opsForValue().getAndSet("key2", "new_value2");
		System.out.println(oldValue2);
		//通過key獲取值
		String value2 = (String) redisTemplate.opsForValue().get("key2");
		System.out.println(value2);
		//求子串
		String rangeValue2 = (String) redisTemplate.opsForValue().get("key2", 0, 3);
		System.out.println(rangeValue2);
		//追加字串到末尾,返回新串長度
		int newLen = redisTemplate.opsForValue().append("key2", "_app");
		System.out.println(newLen);
		String appendValue2 = (String) redisTemplate.opsForValue().get("key2");
		System.out.println(appendValue2);
	}

執行結果:

value1 6 value2 new_value2 new_ 14 new_value2_app

------------------------------------------------------------------------------------------------------------------------------------------------------- 程式碼主要只是在Spring中操作Redis鍵值對,其它資料型別直接總結Redis客戶端命令對應的RedisTemplate中的方法。

首先要知道,RedisTemplate中定義了對5種資料結構進行操作:

redisTemplate.opsForValue();//操作字串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

以下依次給出各類資料型別的Redis客戶端命令對應的RedisTemplate中的方法

String型別結構
Redis RedisTemplate rt
set key value rt.opsForValue().set("key","value")
get key rt.opsForValue().get("key")
del key rt.delete("key")
strlen key rt.opsForValue().size("key")
getset key value rt.opsForValue().getAndSet("key","value")
getrange key start end rt.opsForValue().get("key",start,end)
append key value rt.opsForValue().append("key","value")
Hash結構
hmset key field1 value1 field2 value2... rt.opsForHash().putAll("key",map) //map是一個集合物件
hset key field value rt.opsForHash().put("key","field","value")
hexists key field rt.opsForHash().hasKey("key","field")
hgetall key rt.opsForHash().entries("key")  //返回Map物件
hvals key rt.opsForHash().values("key") //返回List物件
hkeys key rt.opsForHash().keys("key") //返回List物件
hmget key field1 field2... rt.opsForHash().multiGet("key",keyList)
hsetnx key field value rt.opsForHash().putIfAbsent("key","field","value"
hdel key field1 field2 rt.opsForHash().delete("key","field1","field2")
hget key field rt.opsForHash().get("key","field")
List結構
lpush list node1 node2 node3...   rt.opsForList().leftPush("list","node") 
rt.opsForList().leftPushAll("list",list) //list是集合物件
rpush list node1 node2 node3... rt.opsForList().rightPush("list","node") 
rt.opsForList().rightPushAll("list",list) //list是集合物件
lindex key index rt.opsForList().index("list", index)
llen key rt.opsForList().size("key")
lpop key rt.opsForList().leftPop("key")
rpop key rt.opsForList().rightPop("key")
lpushx list node rt.opsForList().leftPushIfPresent("list","node")
rpushx list node rt.opsForList().rightPushIfPresent("list","node")
lrange list start end rt.opsForList().range("list",start,end)
lrem list count value rt.opsForList().remove("list",count,"value")
lset key index value rt.opsForList().set("list",index,"value")
ltrim key start stop //

有些命令Spring所提供的RedisTemplate並不能支援,比如linsert命令,這個時候可以使用更為底層的方法,如程式碼:

    try {
			rt.getConnectionFactory().getConnection().lInsert("list".getBytes("utf-8"),
					RedisListCommands.Position.BEFORE, 
					"node2".getBytes("utf-8"), "before_node2".getBytes("utf-8"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
Set結構
sadd key member1 member2... rt.boundSetOps("key").add("member1","member2",...)
rt.opsForSet().add("key", set) //set是一個集合物件
scard key rt.opsForSet().size("key")
sidff key1 key2 rt.opsForSet().difference("key1","key2") //返回一個集合物件
sinter key1 key2 rt.opsForSet().intersect("key1","key2")//同上
sunion key1 key2 rt.opsForSet().union("key1","key2")//同上
sdiffstore des key1 key2 rt.opsForSet().differenceAndStore("key1","key2","des")
sinter des key1 key2 rt.opsForSet().intersectAndStore("key1","key2","des")
sunionstore des key1 key2 rt.opsForSet().unionAndStore("key1","key2","des")
sismember key member rt.opsForSet().isMember("key","member")
smembers key rt.opsForSet().members("key")
spop key rt.opsForSet().pop("key")
srandmember key count rt.opsForSet().randomMember("key",count)
srem key member1 member2... rt.opsForSet().remove("key","member1","member2",...)

注意,如果命令中對應RedisTemplate方法中的引數是物件或者字串,記得修改配置檔案中RedisTemplate中屬性keySerializer和valueSerializer的值。

另外還有ZSet和HyperLogLog結構命令比較難用並且出現頻率不高,有需要再整理。