如何解决springredisTemplate使用中发现的问题
本篇内容介绍了“如何解决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 的环节。
发现此处,redisTemplate 将指定的key转换为二进制处理的,难道是这里有问题?
继续跟进
原来redisTemplate 为指定的key,通过keySerializer序列化成了二进制。
那这keySerializer是哪来的呢,继续追踪。
原来当redisTemplate 没有指定key的序列化方案是,会使用默认的序列化方式,而默认的序列化方式就是使用JdkSerializationRedisSerializer。
而JdkSerializationRedisSerializer.serialize的序列化方式如下
会发现,关键部分是serializer.convert(object)方法。而serializer是jdk序列化方案的一个属性,在对象构造的时候就指定了
SerializingConverter的转换方法如下
DefaultSerializer.serialize 方法如下
而在这个对象输出流里,则会加一个类型前缀
方便以后反序列化时识别流的类型是什么,这也就是我们会发现key前面会多一串字符的由来。
例如我将一个空字符串对象输出成流,其结果转成16进制,也是:ACED0005740000。
所以,因为这里序列化的是一个对象(Object),必不可少的会加上对象的类型等相关信息,方便以后反序列化的时候使用。
解决办法
1、redisTemplate 指定keySerializer,用StringRedisSerializer 替换JdkSerializationRedisSerializer
2、spring 还提供了一个StringRedisTemplate 的实现类,这个是将key,value全部当作字符串来处理的。用这个就没问题了。
“如何解决spring redisTemplate 使用中发现的问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
网站栏目:如何解决springredisTemplate使用中发现的问题
文章地址:http://ybzwz.com/article/jdhhij.html