前言说明
笔者所在的项目中,有两个服务之间需要使用redis实现通信,及一个服务存入(key,value),另一个服务get(key)实现通信。使用过程中发现redis通信存在问题,最终重写RedisTemplate序列化方式后问题得到解决。
现象描述
- 服务A通过RedisTemplate.opsForValue().set()存入key,在服务B中RedisTemplate.opsForValue().get(key),没能获取到任何内容,日志打印两服务中的key,发现两服务key值没有问题。
- 服务A使用RedisTemplate.opsForList().leftPushAll(QUEUEKEY,queueValueList)往队列中添加对象,使用redis管理工具,查看到redis中实际存储的queueValue,被加上了一些特殊字符,如\xac\xed\x00\x05t\x00\queueValue1
问题分析
通过现象二,发现写入redis的值被转码了,通过查看RedisTemplate源码,知道RedisTemplate默认序列化方式:org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
@Override
public byte[] serialize(@Nullable Object object) {
if (object == null) {
return SerializationUtils.EMPTY_ARRAY;
}
try {
return serializer.convert(object);
} catch (Exception ex)