RedisTemplate和StringRedisTemplate的使用導致數據不一致


RedisTemplate和StringRedisTemplate的區別:

1. 兩者的關系是StringRedisTemplate繼承RedisTemplate。

2. 兩者的數據是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate里面的數據,RedisTemplate只能管理RedisTemplate中的數據。

3. SDR默認采用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。

StringRedisTemplate默認采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默認采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate使用的序列類在在操作數據的時候,比如說存入數據會將數據先序列化成字節數組然后在存入Redis數據庫,這個時候打開Redis查看的時候,你會看到你的數據不是以可讀的形式展現的,而是以字節數組顯示,類似下面

 

 


當然從Redis獲取數據的時候也會默認將數據當做字節數組轉化,這樣就會導致一個問題,當需要獲取的數據不是以字節數組存在redis當中而是正常的可讀的字符串的時候,比如說下面這種形式的數據

 

 


注:使用的軟件是RedisDesktopManager

RedisTemplate就無法獲取導數據,這個時候獲取到的值就是NULL。這個時候StringRedisTempate就派上了用場。


當Redis當中的數據值是以可讀的形式顯示出來的時候,只能使用StringRedisTemplate才能獲取到里面的數據。

所以當你使用RedisTemplate獲取不到數據的時候請檢查一下是不是Redis里面的數據是可讀形式而非字節數組


另外我在測試的時候即使把StringRedisTemplate的序列化類修改成RedisTemplate的JdkSerializationRedisSerializer

最后還是無法獲取被序列化的對象數據,即使是沒有轉化為對象的字節數組,代碼如下

    @Test  
    public void testRedisSerializer(){  
        User u = new User();  
        u.setName("java");  
        u.setSex("male");  
        redisTemplate.opsForHash().put("user:","1",u);  
        /*查看redisTemplate 的Serializer*/  
        System.out.println(redisTemplate.getKeySerializer());  
        System.out.println(redisTemplate.getValueSerializer());  
        
        /*查看StringRedisTemplate 的Serializer*/  
        System.out.println(stringRedisTemplate.getValueSerializer());  
        System.out.println(stringRedisTemplate.getValueSerializer());  
        
        /*將stringRedisTemplate序列化類設置成RedisTemplate的序列化類*/  
        stringRedisTemplate.setKeySerializer(new JdkSerializationRedisSerializer());  
        stringRedisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());  
        
        /*即使在更換stringRedisTemplate的的Serializer和redisTemplate一致的
        * JdkSerializationRedisSerializer
        * 最后還是無法從redis中獲取序列化的數據
        * */  
        System.out.println(stringRedisTemplate.getValueSerializer());  
        System.out.println(stringRedisTemplate.getValueSerializer());  
        
        User user = (User)  redisTemplate.opsForHash().get("user:","1");  
        User  user2 = (User) stringRedisTemplate.opsForHash().get("user:","1");  
        System.out.println("dsd");  
    }


Debug結果

總結:

當你的redis數據庫里面本來存的是字符串數據或者你要存取的數據就是字符串類型數據的時候,那么你就使用StringRedisTemplate即可,但是如果你的數據是復雜的對象類型,而取出的時候又不想做任何的數據轉換,直接從Redis里面取出一個對象,那么使用RedisTemplate是更好的選擇。

原文鏈接:https://blog.csdn.net/yifanSJ/java/article/details/79513179


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM