专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

spring redisTemplate 使用中发现的问题

背景

今天在使用spring 自带的redis功能时,发现一个问题。在使用redisTemplate这个实现类,set 一个string key是,set成功,然后再通过程序get key时,也能成功拿到。但是通过redis 命令行获取上述的key时,会发现一个奇怪的问题,无论如何都找不到上述对应的key.
百思不得解!

分析

没办法,本地起环境,查看缓存的redis key,终于发现的问题的所在,原来set到redis里的key,与我们指定的key 不太一样。 我们指定的key是这样的

xxx:xxx:001

但实际redis存储的key是这样的

xac\xed\x00\x05t\x00)xxx:xxx:001

话说这个前缀是哪来的,肯定与redisTemplate 拖不了关系。
打断点跟踪:
首先,跟踪程序到redisTemplate hasKey 的环节。
92_1.png
发现此处,redisTemplate 将指定的key转换为二进制处理的,难道是这里有问题?
继续跟进
92_2.png
原来redisTemplate 为指定的key,通过keySerializer序列化成了二进制。
那这keySerializer是哪来的呢,继续追踪。
92_3.png
原来当redisTemplate 没有指定key的序列化方案是,会使用默认的序列化方式,而默认的序列化方式就是使用JdkSerializationRedisSerializer。
而JdkSerializationRedisSerializer.serialize的序列化方式如下
92_4.png
会发现,关键部分是serializer.convert(object)方法。而serializer是jdk序列化方案的一个属性,在对象构造的时候就指定了
92_5.png
SerializingConverter的转换方法如下
92_6.png
DefaultSerializer.serialize 方法如下
92_7.png
而在这个对象输出流里,则会加一个类型前缀
92_8.png
92_9.png
方便以后反序列化时识别流的类型是什么,这也就是我们会发现key前面会多一串字符的由来。
例如我将一个空字符串对象输出成流,其结果转成16进制,也是:ACED0005740000。
所以,因为这里序列化的是一个对象(Object),必不可少的会加上对象的类型等相关信息,方便以后反序列化的时候使用

解决办法

1、redisTemplate 指定keySerializer,用StringRedisSerializer 替换JdkSerializationRedisSerializer

2、spring 还提供了一个StringRedisTemplate 的实现类,这个是将key,value全部当作字符串来处理的。用这个就没问题了。

文章永久链接:https://tech.souyunku.com/25042

未经允许不得转载:搜云库技术团队 » spring redisTemplate 使用中发现的问题

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们