spring-data-redis 使用过程当中须要注意的一点

这里主要说下碰到的问题,首先,采用了spring-data-redis(如下简称SDR)中的Template进行redis的操做。redis

由于考虑到后期的使用场景,因而同时采用了StringRedisTemplate和RedisTemplate,而且对存储String与存储Java对象采用不一样的Template进行了简单的封装。spring

首先是测试 保存与取出方法。分别用不一样的template能够完美经过。测试

而后在测试删除的方法中,测试出现了问题。spa

问题以下:code

    在采用StringRedisTemplate进行保存的数据,用StringRedisTemplate去删除能够成功删除。xml

    在采用RedisTemplate进行保存的数据,用RedisTemplate去删除也能够删除成功。对象

    在用RedisTemplate去删除StringRedisTemplate保存的数据时,发现删除失败。文档

    在用StringRedisTemplate去删除RedisTemplate保存的数据时,删除失败。string

由于,须要封装一套通用的删除方法,而且须要封装一个批量删除的方法。因此研究了下问题出现的缘由。hash

通过查看SDR官方给出的文档,发现是由于序列化策略的问题。

这里简单说下:

    SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

就是由于序列化策略的不一样,即便是同一个key用不一样的Template去序列化,结果是不一样的。因此根据key去删除数据的时候就出现了删除失败的问题。

解决方法以下,手动指定RedisTemplate的key的序列化策略

<!-- redis 序列化策略 ,一般状况下key值采用String序列化策略, -->
<!-- 若是不指定序列化策略,StringRedisTemplate的key和value都将采用String序列化策略; -->
<!-- 可是RedisTemplate的key和value都将采用JDK序列化 这样就会出现采用不一样template保存的数据不能用同一个template删除的问题 -->
<bean id="stringRedisSerializer" 
    class="org.springframework.data.redis.serializer.StringRedisSerializer" />

<bean id='redisWriteTemplate' class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisWriteConnectionFactory" />
    <property name="keySerializer" ref="stringRedisSerializer" />
    <property name="hashKeySerializer" ref="stringRedisSerializer" />
</bean>

这样就能完美的删除了。

这里推荐将全部Template的key都采用String的序列化方式,而value的序列化方式能够采用不一样的序列化方式。

另外 出来这两个序列化方式以外,SDR还提供了  

JacksonJsonRedisSerializer
Jackson2JsonRedisSerializer
OxmSerializer

等序列化方法,你们能够分别采用各类序列化方式作一些试验。

相关文章
相关标签/搜索