Redis常用命令對應的Spring中RedisTemplate操作方法
阿新 • • 發佈:2018-12-17
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中的方法
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") |
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") |
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();
}
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結構命令比較難用並且出現頻率不高,有需要再整理。