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中的方法
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结构命令比较难用并且出现频率不高,有需要再整理。