一、Spring Data Redis
Spring Data Redis 提供Jedis,Jredis,rjc等客户端的封装,可以根据需求更换换客服端,使业务代码比较稳定性。 以及提供对连接池管理 (timeout、maxActive、maxIdle等参数),org.springframework.data.redis.connection包中的RedisConnection和RedisConnectionFactory类来获取Redis连接,Spring Data Redis 提供RedisTemplate是对RedisConnection进行封装,提供了连接管理,序列化等功能,它对Redis的交互进行了更高层次的抽象,对调用做了封装,省去了建立连接,释放连接等繁琐代码。
二、RedisTemplate
Spring Data Redis 像hibernate等一样提供了模板,Spring Data Redis提供了RedisTemplate和StringRedisTemplate这两种模板,我们可以通过Spring容器进行管理:
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean>
Jedis的客户端API接受的数据类型为String和byte。我们有时保存对象时,需要转换为byte或者String。
1、RedisSerializer
Org.springframework.data.redis.serializer包下提供了几种系列化
JdkSerializationRedisSerializer:是JDK自带的系列化,通过对实体类ObjectInputStream/ObjectOutputStream进行序列化操作。实体类必须实现Serializable不然会报错。
Jackson2JsonRedisSerializer:是将实体类转换为JSON在进行系列化。
OxmSerializer:是将实体类转换为XML在进行系列化。
StringRedisSerializer:string.getBytes(charset)通过String提供的方法获取二进制数组。
2、StringRedisTemplate
StringRedisTemplate extends RedisTemplate<String, String>,默认使用StringRedisSerializer对value进行系列化。
3、RedisTemplate
提供了对key、value、hashKey、hashValue进行系列化方式:
private RedisSerializer keySerializer = null;
private RedisSerializer valueSerializer = null;
private RedisSerializer hashKeySerializer = null;
private RedisSerializer hashValueSerializer = null;
默认使用 JdkSerializationRedisSerializer对对象进行系列化。
总结:
JSON或者XML转换为字符串进行存储由StringRedisTemplate来操作。
有些不转换字符串的对象需要系列化进行存储由RedisTemplate来操作 。
三、API概述
Spring Data Redis 提供RedisTemplate操作Redis,能方便我们开发,RedisTemplate提供的操作视图(从Redis命令参考分组),提供丰富的,泛型接口的工作对key类型(通过按key类型绑定接口)操作。还可以对key设置过期时间。
1、区别
Key类型操作:可以在一个连接上可以同时操作多个key。
key绑定操作:在一个连接上绑定具体的key,只能对这个key进行操作。
通过例子能理解区别在哪里:
2、接口说明
Org.springframework.data.redis.core 包中定义了接口以及对接口的实现。
Key类型操作提供的接口:
ValueOperations Redis String/Value操作
ListOperations Redis List 操作
SetOperations Redis Set 操作
ZSetOperations Redis Sort Set 操作
HashOperations Redis Hash 操作
key绑定操作提供的接口:
BoundValueOperations Redis String/Value key绑定操作
BoundListOperations Redis List key绑定操作
BoundSetOperations Redis Set key 绑定操作
BoundZSetOperations Redis Sort Set key绑定操作
BoundHashOperations Redis Hash key 绑定操作
3、key设置过期时间
可以给key设置过期时间,时间到了自动删除key,这样对不需要存储太长的数据进行清除,以免占用内存空间。设置key过期有两种方式:
1、set(K key, V value, final longtimeout, final TimeUnit unit)
2、expire(K key, final long timeout, final TimeUnit unit)
五、简单例子
redis.host=192.168.1.100
redis.port=6379
<!-- 获取配置资源 -->
<context:property-placeholder location="classpath:redis.properties" />
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}"
/>
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean>
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisTemplate redisTemplate;
@Override
public void set(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
@SuppressWarnings("unchecked")
@Override
public void setObject(Object key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
@Test
public void testAdd()
{
User user=new User();
user.setCzry("name");
user.setMm("mm");
redisStringDao.set("test1", JSONObject.toJSONString(user));
redisStringDao.setObject("test2", user);
}