RedisTemplate:我不背锅,是你用错了

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

RedisTemplate:我不背锅,是你用错了

猿天地   2020-03-11 我要评论
今天分享一个RedisTemplate的问题,感兴趣的可以继续看下去了,不感兴趣的继续撩妹去吧! 如下图:一位朋友给了我一个报错的图片,为啥为啥取不到值? ![](https://img2020.cnblogs.com/blog/1618095/202003/1618095-20200311134847500-360721412.png) 我也有点懵,第一反应就是RedisTemplate和StringRedisTemplate会不会用的两个不同的Connection,导致相同的Key一个能查到,一个不能查到。 经过反复确认,Connection没问题,是同一个,还是那句话:**每个奇怪问题的背后一定有故事。** 只能调试源码了呗,还能怎么办。最后在redis.clients.jedis.BinaryJedis#hget中发现了问题,就是Redis压根就没有返回数据。 现在的问题就剩下为什么StringRedisTemplate的查询可以返回数据,RedisTemplate的查询却不能返回数据? 我们来屡一下StringRedisTemplate和RedisTemplate的关系,StringRedisTemplate继承了RedisTemplate,是专门用于字符串操作。 RedisTemplate一般用于比较复杂的对象操作,区别就在于序列化的不同。 于是我用redis客户端查看了存储的数据格式,发现这个Hash的格式是字符串。 ![](https://img2020.cnblogs.com/blog/1618095/202003/1618095-20200311134904174-1934116272.png) 这也就是为什么用StringRedisTemplate可以获取到,估计存储的时候就是用的StringRedisTemplate。 RedisTemplate默认的序列化方式是JDK序列化,格式不对。 于是查看了RedisTemplate的构造方式,发现就是序列化方式不一致。 ![](https://img2020.cnblogs.com/blog/1618095/202003/1618095-20200311134918615-1837836397.png) 于是将jdkSerializationRedisSerializer改成了stringSerializer。重新跑了一遍测试还是不行。于是我看了下RedisTemplate对象的信息,如下: ![](https://img2020.cnblogs.com/blog/1618095/202003/1618095-20200311134935423-156480521.png) valueSerializer是改过来了,但是hash有专门的序列化,还是JDK。 那就全部改成一样的吧,如下: ![](https://img2020.cnblogs.com/blog/1618095/202003/1618095-20200311134949586-1966854013.png) 然后就能获取到了,个人感觉这个还是一个使用的问题,可能大家都以为这2个RedisTemplate是一样的,没什么差别,所以才导致了本文出现的问题。 如果你够细心,其实看下源码就知道这2个类的区别了。 ![](https://img2020.cnblogs.com/blog/1618095/202003/1618095-20200311135003703-1755343256.png) StringRedisTemplate构建的时候默认设置了所有的序列化方式为String,也就是说StringRedisTemplate的数据格式都是String。 RedisTemplate没有设置的话就都是JDK。 ![](https://img2020.cnblogs.com/blog/1618095/202003/1618095-20200311135027450-1841766790.png)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们