温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何解决spring redisTemplate 使用中发现的问题

发布时间:2021-07-02 17:52:10 来源:亿速云 阅读:252 作者:chen 栏目:大数据

本篇内容介绍了“如何解决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 的环节。
如何解决spring redisTemplate 使用中发现的问题
发现此处,redisTemplate 将指定的key转换为二进制处理的,难道是这里有问题?
继续跟进
如何解决spring redisTemplate 使用中发现的问题
原来redisTemplate 为指定的key,通过keySerializer序列化成了二进制。
那这keySerializer是哪来的呢,继续追踪。
如何解决spring redisTemplate 使用中发现的问题
原来当redisTemplate 没有指定key的序列化方案是,会使用默认的序列化方式,而默认的序列化方式就是使用JdkSerializationRedisSerializer。
而JdkSerializationRedisSerializer.serialize的序列化方式如下
如何解决spring redisTemplate 使用中发现的问题
会发现,关键部分是serializer.convert(object)方法。而serializer是jdk序列化方案的一个属性,在对象构造的时候就指定了
如何解决spring redisTemplate 使用中发现的问题
SerializingConverter的转换方法如下
如何解决spring redisTemplate 使用中发现的问题
DefaultSerializer.serialize 方法如下
如何解决spring redisTemplate 使用中发现的问题
而在这个对象输出流里,则会加一个类型前缀
如何解决spring redisTemplate 使用中发现的问题
如何解决spring redisTemplate 使用中发现的问题
方便以后反序列化时识别流的类型是什么,这也就是我们会发现key前面会多一串字符的由来。
例如我将一个空字符串对象输出成流,其结果转成16进制,也是:ACED0005740000。
所以,因为这里序列化的是一个对象(Object),必不可少的会加上对象的类型等相关信息,方便以后反序列化的时候使用

解决办法

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

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

“如何解决spring redisTemplate 使用中发现的问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI