spring使用RedisTemplate的操作類訪問Redis
事務需要開啟enableTransactionSupport,然后使用@transactional注解,里面直接通過回調(diào)的connection,就不需要自己進行multi和exec的事務開啟提交了。但是通過回調(diào)去獲取connection,完全沒有達到一個模版類的功能。所以這篇我們會講下幾種Operations接口提供的方法。
private ValueOperations<K, V> valueOps; private ListOperations<K, V> listOps; private SetOperations<K, V> setOps; private ZSetOperations<K, V> zSetOps;
1. RedisOperations接口說明
這個接口的實現(xiàn)類就是RedisTemplate本身,主要提供了一些對Redis鍵,事務,運行腳本等命令的支持,不負責數(shù)據(jù)的讀寫。
我們選一段代碼看下:
public void watch(K key) {
final byte[] rawKey = rawKey(key);
execute(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) {
connection.watch(rawKey);
return null;
}
}, true);
}
這個是事務的監(jiān)視命令,可以看出,里面的實現(xiàn)也是用的回調(diào)RedisCallback。這些api都是通過connection的api來進行了封裝。
2. ValueOperations接口說明
這個接口的實現(xiàn)類為DefaultValueOperations,default這個類同時繼承AbstractOperation,我們來看下這個類的構造函數(shù):
DefaultValueOperations(RedisTemplate<K, V> template) {
super(template);
}
非公開的,需要傳入template來構造。但是我們是無法訪問的。不過不要急,在RedisTemplate中,已經(jīng)提供了一個工廠方法:opsForValue()。這個方法會返回一個默認的操作類。另外,我們可以直接通過注解@Resource(name = "redisTemplate")來進行注入。
@Resource(name = "redisTemplate") private ValueOperations<String, Object> vOps;
是不是很奇怪,毫無父子兄弟關系的兩個類,怎么能互相注入呢?這個是Spring的Editor機制,搜索下ValueOperationsEditor這個類就知道了,Spring在注入的時候調(diào)用了Editor的setValue方法。了解Spring源碼的應該知道。我也是看別人的文章才理解的。
其實除了可以通過template注入ValueOperations,還可以注入 上面的其他幾種operations以及HashOperations.
DefaultValueOperations提供了所有Redis字符串類型的操作api。比如set,get,incr等等。使用這些方法,可以方便的直接存儲任意的java類型,而不需要自己去將存儲的東西序列化以及反序列化。
注意:泛型的類型,以及序列化器都是來自RedisTemplate。如果要自行進行json或者其他的序列化,就需要在RedisTemplate中進行更改。
另外,對于成員listOps,setOps,zSetOps這接個操作類,就不再贅述,原理同ValueOperations,是其他幾種數(shù)據(jù)類型的實現(xiàn)。
3. HashOperations接口說明
這個接口并沒有定義成員變量,猜測是因為對于Hash來說,又增加了額外的Key和Value,泛型無法在成員前額外定義,所以直接提供了方法。不過所幸里面用的是JdkSerializer,所以這個定義了什么類型的泛型都不會產(chǎn)生運行異常。
public void put(K key, HK hashKey, HV value) {
final byte[] rawKey = rawKey(key);
final byte[] rawHashKey = rawHashKey(hashKey);
final byte[] rawHashValue = rawHashValue(value);
execute(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) {
connection.hSet(rawKey, rawHashKey, rawHashValue);
return null;
}
}, true);
}
這個是基本的put方法,可以看出key和hashkey這兩個,調(diào)用了不同的序列化方法。進行方法查看,看到序列化hashkey用的是template里的hashkeyserializer,默認是jdkserializer,這個會導致在redis控制臺,看不出來存了什么key。如果不喜歡,可以通過redistemplate.sethashkeyserializer()來進行設置。
對于hash結構所有的api,也都在這個類里進行了封裝,比如hset變?yōu)榱藀ut,hget變?yōu)間et。需要自行去查看api。不要被誤導。
4. 總結
到這里為止,已經(jīng)把基本的使用都說完了。說的很粗糙,只是把我覺得容易出現(xiàn)誤解的點進行了重點說明,基礎的操作還需要大家自己稍微看下。權作一個拋磚引玉的作用吧。接下來,可能會總結下在這兩個月用Redis遇到的一些問題進行說明。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java利用位運算實現(xiàn)比較兩個數(shù)的大小
這篇文章主要為大家介紹了,在Java中如何不用任何比較判斷符(>,==,<),返回兩個數(shù)( 32 位整數(shù))中較大的數(shù),感興趣的可以了解一下2022-08-08
Java連接合并2個數(shù)組(Array)的5種方法例子
最近在寫代碼時遇到了需要合并兩個數(shù)組的需求,突然發(fā)現(xiàn)以前沒用過,于是研究了一下合并數(shù)組的方式,這篇文章主要給大家介紹了關于Java連接合并2個數(shù)組(Array)的5種方法,需要的朋友可以參考下2023-12-12
spring boot 自定義starter的實現(xiàn)教程
下面小編就為大家分享一篇spring boot 自定義starter的實現(xiàn)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
基于@RequestParam name和value屬性的區(qū)別
這篇文章主要介紹了@RequestParam name和value屬性的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot 動態(tài)數(shù)據(jù)源的實現(xiàn)方法(Mybatis+Druid)
這篇文章主要介紹了springboot 動態(tài)數(shù)據(jù)源的實現(xiàn)方法(Mybatis+Druid),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01

