關於RedisTemplate和StringRedisTemplate(轉)


最近在開始在學習Redis以及如何在Java當中去使用Redis,Redis是什么我這里就不說了。

我主要想說的是Redis和Java當中Spring結合起來的時候,使用到的RedisTemplate和StringRedisTemplate

他們兩者之間的區別,以及該怎么使用。

RedisTemplate看這個類的名字后綴是Template,如果了解過Spring如何連接關系型數據庫的,大概不會難猜出這個類是做什么的 ,它跟JdbcTemplate一樣封裝了對Redis的一些常用的操作,當然StringRedisTemplate跟RedisTemplate功能類似那么肯定就會有人問,為什么會需要兩個Template呢,一個不就夠了嗎?其實他們兩者之間的區別主要在於他們使用的序列化類。

RedisTemplate使用的是 JdkSerializationRedisSerializer
StringRedisTemplate使用的是 StringRedisSerializer

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");
      }

 

 

總結:
當你的redis數據庫里面本來存的是字符串數據或者你要存取的數據就是字符串類型數據的時候,那么你就使用StringRedisTemplate即可,
但是如果你的數據是復雜的對象類型,而取出的時候又不想做任何的數據轉換,直接從Redis里面取出一個對象,那么使用RedisTemplate是
更好的選擇。
附注:
————————————————
版權聲明:本文為CSDN博主「notsaltedfish」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/notsaltedfish/article/details/75948281


免責聲明!

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



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