线上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都存在,老数据走老的新数据走新的但是需要能够区分新老数据。
或者你写个 工具类把老数据的全不用新数据转换保存下
以上是线上RedisTemplate的value序列化设置如何无感的由JdkSerializationRedisSerializer替换为GenericJackson2JsonRedisSerializer的全部内容。
THE END
二维码