簡(jiǎn)介
Redis作為非關(guān)系型數(shù)據(jù)庫(kù)廊移,因?yàn)槠涓咝阅懿l(fā)讀寫的特點(diǎn)而得到廣泛的應(yīng)用抽米。
Spring作為Java應(yīng)用框架播瞳,提供了一個(gè)輕量級(jí)的容器和非侵入性編程模型。
Spring Data Redis(SDR)框架通過(guò)Spring出色的基礎(chǔ)架構(gòu)支持消除了與存儲(chǔ)庫(kù)交互所需的冗余任務(wù)和樣板代碼乃摹,從而簡(jiǎn)化了編寫使用Redis鍵值存儲(chǔ)庫(kù)的Spring應(yīng)用程序的過(guò)程禁漓。
Redis的數(shù)據(jù)類型 vs 存入Redis的數(shù)據(jù)的數(shù)據(jù)類型
- Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希)孵睬,list(列表)播歼,set(集合)及zset(sorted set:有序集合),這里的數(shù)據(jù)類型指的是Redis如何存儲(chǔ)數(shù)據(jù)掰读,是指存儲(chǔ)的方式秘狞。
- 同時(shí),在Redis中存入的數(shù)據(jù)有有自己的數(shù)據(jù)類型蹈集,如果將Java引用的數(shù)據(jù)存入Redis烁试,存入的數(shù)據(jù)類型可以是Long、List拢肆、String等等减响。不論是什么數(shù)據(jù)類型,最終在Redis中都是存儲(chǔ)為字節(jié)郭怪。將各種數(shù)據(jù)類型轉(zhuǎn)化為字節(jié)的過(guò)程就是序列化支示。
RedisTemplate及其序列化
RedisTemplate為Redis交互提供了高級(jí)抽象,用戶只需要處理連接管理和序列化移盆,無(wú)需處理其它細(xì)節(jié)悼院,接受和返回二進(jìn)制值(字節(jié)數(shù)組)等底層方法由RedisConnection負(fù)責(zé)伤为。在Spring應(yīng)用中使用RedisTemplate的方式為
@Autowired
private RedisTemplate<String, Long> template;
Spring Data Redis 默認(rèn)使用JdkSerializationRedisSerializer
作為其序列化工具
// RedisTemplate.java
if (defaultSerializer == null) {
defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
}
StringRedisTemplate使用的注意事項(xiàng)
由于Redis中存儲(chǔ)的鍵和值通常是java.lang.String
咒循,因此Redis模塊提供了RedisConnection
和RedisTemplate
的兩個(gè)擴(kuò)展,分別是StringRedisConnection
和StringRedisTemplate
绞愚,其使用的序列化工具為StringRedisSerializer
叙甸,這意味著存儲(chǔ)的鍵和值是人類可讀的。
StringRedisTemplate的注入和普通RedisTemplate的注入方式相同:
@Autowired
private StringRedisTemplate redisTemplate;
但實(shí)際上位衩,StringRedisTemplate的還有一種更方便的注入方式裆蒸。Spring自帶的RedisAutoConfiguration中配置了,當(dāng)沒(méi)有自定義StringRedisTemplate Bean時(shí)糖驴,它會(huì)自動(dòng)幫你注冊(cè)一個(gè)該類型的Bean.
// RedisAutoConfiguration.java
@Bean
@ConditionalOnMissingBean(StringRedisTemplate.class)
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
使用StringRedisTemplate的時(shí)候直接在代碼中注入RedisTemplate<String, String>
的RedisTemplate Bean僚祷,實(shí)際上StringRedisTemplate也繼承自RedisTemplate<String, String>
佛致,Spring在自動(dòng)裝配Bean的時(shí)候會(huì)將自注冊(cè)的Bean裝配進(jìn)來(lái),這樣的代碼就省略了手動(dòng)注冊(cè)StringRedisTemplate
的過(guò)程辙谜。
@Autowired
private RedisTemplate<String, String> redisTemplate;
// StringRedisTemplate.java
public class StringRedisTemplate extends RedisTemplate<String, String> {
...
}