一点Redis序列化分析
date
Jun 24, 2021
slug
一点Redis序列化分析
status
Published
tags
Redis
summary
type
Post
前一阵子在公司项目上用redis作队列,在将内容序列化后丢进队列后,消费者总是反序列化失败,看了下redis队列中的内容,总是在最前面多出了一串\xac\xed\x00\x05t\x00\tb,无论是字符串还是二进制数据都会多出这一串字符串,导致消费者反序列化失败。开始一直以为是对象序列化出了问题,后来发现是redisTemplate的问题。
向队列发送对象用的是convertAndSend方法,然后我发现使用StringRedisTemplate的convertAndSend方法的时候序列化没有问题,当使用RedisTemplate的convertAndSend方法的时候序列化的时候就会多出一串\xac\xed\x00\x05t\x00\tb。
查看源码分析:
convertAndSend方法源码:
接着查看rawValue方法:
通过查看代码发现,redisTemplate的valueSerializer用的是默认的序列化器JdkSerializationRedisSerializer,stringRedisTemplate的valueSerializer是stringRedisSerializer,而这两者的序列化方法实现不同。
JdkSerializationRedisSerializer的序列化方法:
该方法的序列化方法就是导致序列化内容前有一串\xac\xed\x00\x05t\x00\tb的原因。
StringSerializationRedisSerializer的序列化方法:
至于为什么会多一串\xac\xed\x00\x05t\x00\tb我还没有搞明白,目前我的解决方法是把要序列化的对象序列化成json字符串,使用stringRedisTemplate的convertAndSend.
另参考: