背景
项目使用Spring的RedisTemplate进行Redis数据存取操作,实际应用中发现Redis中key和value会出现“无意义”乱码前缀\xac\xed\x00\x05t\x00-(样例\xac\xed\x00\x05t\x00-abcd:abc:xxxxxx:passport:associated:key:29708)。
这个乱码前缀是怎么产生的呢?有什么含义?是不是固定的?带着这三个问题,我们一探究竟。
疑问探究
怎么产生的
org.springframework.data.redis.core.RedisTemplate实例化需要序列化和反序列化组件,如果我们不指定,默认使用org.springframework.data.redis.serializer.JdkSerializationRedisSerializer进行序列化,而JdkSerializationRedisSerializer最终使用的是Java原生java.io.ObjectOutputStream.ObjectOutputStream(OutputStream)进行序列化。
这个乱码前缀就是ObjectOutputStream进行序列化时添加的。
有什么含义
\x对应0x
\xac\xed对应是0xaced,是ObjectOutputStream的序列化魔数(见java.io.ObjectStreamConstants.STREAM_MAGIC)。
\x00\x05对应是5,是ObjectOutputStream的序列化版本(见java.io.ObjectStreamConstants.STREAM_VERSION)。
这里引出一个小问题:为什么是\x00\x05而不是\x05?
因为上面2个值write时采用的是short,占2个字节。
样例乱码\x05后面有个t,不是

本文揭秘Spring RedisTemplate中出现的无意义乱码前缀,解析其由ObjectOutputStream序列化机制产生的原因,并指导如何利用这些知识在实际排查缓存问题时使用。建议使用StringRedisSerializer替换默认配置。

558

被折叠的 条评论
为什么被折叠?



