RedisTemplate操作Redis,這一篇文章就夠了(一)
StringRedisTemplate和RedisTemplate的區別(二)
StringRedisTemplate的一個小案例(三)
一、RedisTemplate和StringRedisTemplate的區別:
- 兩者的關係是StringRedisTemplate繼承RedisTemplate。
- 兩者的數據是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate裏面的數據,RedisTemplate只能管理RedisTemplate中的數據。
- SDR默認採用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。
StringRedisTemplate默認採用的是String的序列化策略,保存的key和value都是採用此策略序列化保存的。(JdkSerializationRedisSerializer)
RedisTemplate默認採用的是JDK的序列化策略,保存的key和value都是採用此策略序列化保存的。(StringRedisSerializer)
二、StringRedistemplate的源碼
StringRedistemplate的源碼
package org.springframework.data.redis.core;
import org.springframework.data.redis.connection.DefaultStringRedisConnection;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
this();
this.setConnectionFactory(connectionFactory);
this.afterPropertiesSet();
}
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
return new DefaultStringRedisConnection(connection);
}
}
從上面創建StringRedisTemplate的無參構造方法可以看出,此時將keySerializer、valueSerializer、hashKeySerializer、hashValueSerializer的序列化方式爲stringSerializer,也就是StringRedisSerializer序列化方式;此時執行完整個方法後,還需要接着執行setConnectionFactory()方法,然後轉向他的父類RedisTemplate中的afterPropertiesSet方法,此時上述四個序列化方式已經設置;
三、Redis使用的區別
RedisTemplate使用的序列類在在操作數據的時候,比如說存入數據會將數據先序列化成字節數組然後在存入Redis數據庫,這個時候打開Redis查看的時候,你會看到你的數據不是以可讀的形式展現的,而是以字節數組顯示,類似下面(RedisTemplate)
當然從Redis獲取數據的時候也會默認將數據當做字節數組轉化,這樣就會導致一個問題,當需要獲取的數據不是以字節數組存在redis當中而是正常的可讀的字符串的時候,比如說下面這種形式的數據(StringRedisTemplate)
當Redis當中的數據值是以數組形式顯示出來的時候,只能使用RedisTemplate才能獲取到裏面的數據。
當Redis當中的數據值是以可讀的形式顯示出來的時候,只能使用StringRedisTemplate才能獲取到裏面的數據。
所以當你使用RedisTemplate獲取不到數據爲NULL時,一般是獲取的方式錯誤。檢查一下數據是否可讀即可。
四、使用總結:
StringRedisTemplate:當你的redis數據庫裏面本來存的是字符串數據或者你要存取的數據就是字符串類型數據的時候。
RedisTemplate:但是如果你的數據是複雜的對象類型,而取出的時候又不想做任何的數據轉換,直接從Redis裏面取出一個對象。