炫意html5
最早CSS3和HTML5移动技术网站之一

线上RedisTemplate的value序列化设置如何无感的由JdkSerializationRedisSerializer替换为GenericJackson2JsonRedisSerializer

现在线上是这样配置的RedisTemplate,是能够正常使用的。

@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Byte[]> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
// value序列化方式要替换为GenericJackson2JsonRedisSerializer
template.setValueSerializer(new JdkSerializationRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());、
// hashValue序列化方式要替换为GenericJackson2JsonRedisSerializer
template.setHashValueSerializer(new JdkSerializationRedisSerializer());
template.afterPropertiesSet();
return template;
}

有个问题是,使用JdkSerializationRedisSerializer序列化的数据,查看value值容易产生值乱码的感觉,非常不方便排查问题!

如图:

现在也知道将value的序列化方式替换成GenericJackson2JsonRedisSerializer即可,便不会查看是这样一种乱码的感觉。

替换后:

@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.afterPropertiesSet();
return template;
}

但是这样出现了另一个问题,而且非常严重,导致现在不敢替换。

已经在Redis中存在的数据,如果替换后,进行反序列化解析就会报错:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('¬' (code 172)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: (byte[])"�� sr java.lang.Integer⠤���8 I valuexr java.lang.Number������  xp �"; line: 1, column: 2]

 

现在如何能够成功替换且不影响现有数据呢?

回答

缓存数据清了呗

如果不能够清除可以尝试两个方式的bean都存在,老数据走老的新数据走新的但是需要能够区分新老数据。

或者你写个 工具类把老数据的全不用新数据转换保存下

炫意HTML5 » 线上RedisTemplate的value序列化设置如何无感的由JdkSerializationRedisSerializer替换为GenericJackson2JsonRedisSerializer

CSS3教程HTML5教程