zoukankan      html  css  js  c++  java
  • RedisTemplate:我不背锅,是你用错了

    今天分享一个RedisTemplate的问题,感兴趣的可以继续看下去了,不感兴趣的继续撩妹去吧!

    如下图:一位朋友给了我一个报错的图片,为啥为啥取不到值?

    我也有点懵,第一反应就是RedisTemplate和StringRedisTemplate会不会用的两个不同的Connection,导致相同的Key一个能查到,一个不能查到。

    经过反复确认,Connection没问题,是同一个,还是那句话:每个奇怪问题的背后一定有故事。

    只能调试源码了呗,还能怎么办。最后在redis.clients.jedis.BinaryJedis#hget中发现了问题,就是Redis压根就没有返回数据。

    现在的问题就剩下为什么StringRedisTemplate的查询可以返回数据,RedisTemplate的查询却不能返回数据?

    我们来屡一下StringRedisTemplate和RedisTemplate的关系,StringRedisTemplate继承了RedisTemplate,是专门用于字符串操作。

    RedisTemplate一般用于比较复杂的对象操作,区别就在于序列化的不同。

    于是我用redis客户端查看了存储的数据格式,发现这个Hash的格式是字符串。

    这也就是为什么用StringRedisTemplate可以获取到,估计存储的时候就是用的StringRedisTemplate。

    RedisTemplate默认的序列化方式是JDK序列化,格式不对。

    于是查看了RedisTemplate的构造方式,发现就是序列化方式不一致。

    于是将jdkSerializationRedisSerializer改成了stringSerializer。重新跑了一遍测试还是不行。于是我看了下RedisTemplate对象的信息,如下:

    valueSerializer是改过来了,但是hash有专门的序列化,还是JDK。

    那就全部改成一样的吧,如下:

    然后就能获取到了,个人感觉这个还是一个使用的问题,可能大家都以为这2个RedisTemplate是一样的,没什么差别,所以才导致了本文出现的问题。

    如果你够细心,其实看下源码就知道这2个类的区别了。

    StringRedisTemplate构建的时候默认设置了所有的序列化方式为String,也就是说StringRedisTemplate的数据格式都是String。

    RedisTemplate没有设置的话就都是JDK。

  • 相关阅读:
    第4月第1天 makefile automake
    第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash
    第3月第27天 uitableviewcell复用
    learning uboot fstype command
    learning uboot part command
    linux command dialog
    linux command curl and sha256sum implement download verification package
    learning shell script prompt to run with superuser privileges (4)
    learning shell get script absolute path (3)
    learning shell args handing key=value example (2)
  • 原文地址:https://www.cnblogs.com/yinjihuan/p/12462001.html
Copyright © 2011-2022 走看看