Fork me on GitHub

Spring 整合 Redis 的序列化

序列化策略

  • String 序列化

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

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

  • Jackson2JsonRedisSerializer

  • OxmSerializer


可能遇到的问题

因为序列化策略的不同,即使是同一个 key 用不同的 Template 去序列化,结果是不同的。所以根据 key 去进行操作 Redis 中的数据时,就会出现各种操作失败的问题。


解决方案

可以手动指定 RedisTemplate 的 key 的序列化策略

1
2
3
4
5
6
7
8
9
10
<!-- 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 的序列化从而导常用数据格式致为了存储数据结构浪费空间)

参考地址

------本文结束------
0%