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。

  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/yinjihuan/p/12462001.html
Copyright © 2011-2022 走看看