本篇内容介绍了“如何解决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 使用中发现的问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。