序列化策略
String 序列化
StringRedisTemplate 默认采用的是 String 的序列化策略,保存的 key 和 value 都是采用此策略序列化保存的。即 StringRedisSerializer
JDK 序列化
RedisTemplate 默认采用的是 JDK 的序列化策略,保存的 key 和 value 都是采用此策略序列化保存的。即 JdkSerializationRedisSerializer
JacksonJsonRedisSerializer
Jackson2JsonRedisSerializer
OxmSerializer
可能遇到的问题
因为序列化策略的不同,即使是同一个 key 用不同的 Template 去序列化,结果是不同的。所以根据 key 去进行操作 Redis 中的数据时,就会出现各种操作失败的问题。
解决方案
可以手动指定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 的序列化方式可以采用不同的序列化方式。( Jedis 自动选择)(这样还有一个好处就是不必 String 的也采用 JDK 的序列化从而导常用数据格式致为了存储数据结构浪费空间)