深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作類訪問Redis

來源:互聯網
上載者:User

標籤:

上一篇說了RedisTemplate對註解事務的支援,以及提供的序列化器。

事務需要開啟enableTransactionSupport,然後使用@transactional註解,裡面直接通過回調的connection,就不需要自己進行multi和exec的事務開啟提交了。但是通過回調去擷取connection,完全沒有達到一個模版類的功能。所以這篇我們會講下幾種Operations介面提供的方法。

    private ValueOperations<K, V> valueOps;    private ListOperations<K, V> listOps;    private SetOperations<K, V> setOps;    private ZSetOperations<K, V> zSetOps;
1. RedisOperations介面說明

這個介面的實作類別就是RedisTemplate本身,主要提供了一些對Redis鍵,事務,運行指令碼等命令的支援,不負責資料的讀寫。

我們選一段代碼看下:

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

這個是事務的監視命令,可以看出,裡面的實現也是用的回調RedisCallback。這些api都是通過connection的api來進行了封裝。

 

2. ValueOperations介面說明

這個介面的實作類別為DefaultValueOperations,default這個類同時繼承AbstractOperation,我們來看下這個類的建構函式:

    DefaultValueOperations(RedisTemplate<K, V> template) {        super(template);    }

非公開的,需要傳入template來構造。但是我們是無法訪問的。不過不要急,在RedisTemplate中,已經提供了一個Factory 方法:opsForValue()。這個方法會返回一個預設的操作類。另外,我們可以直接通過註解@Resource(name = "redisTemplate")來進行注入。

    @Resource(name = "redisTemplate")    private ValueOperations<String, Object> vOps;

 

是不是很奇怪,毫無父子兄弟關係的兩個類,怎麼能互相注入呢?這個是Spring的Editor機制,搜尋下ValueOperationsEditor這個類就知道了,Spring在注入的時候調用了Editor的setValue方法。瞭解Spring源碼的應該知道。我也是看別人的文章才理解的。文章地址

其實除了可以通過template注入ValueOperations,還可以注入 上面的其他幾種operations以及HashOperations.

DefaultValueOperations提供了所有Redis字串類型的操作api。比如set,get,incr等等。使用這些方法,可以方便的直接儲存任意的java類型,而不需要自己去將儲存的東西序列化以及還原序列化。

注意:泛型的類型,以及序列化器都是來自RedisTemplate。如果要自行進行json或者其他的序列化,就需要在RedisTemplate中變更。

 

另外,對於成員listOps,setOps,zSetOps這接個操作類,就不再贅述,原理同ValueOperations,是其他幾種資料類型的實現。

 

3. HashOperations介面說明

這個介面並沒有定義成員變數,猜測是因為對於Hash來說,又增加了額外的Key和Value,泛型無法在成員前額外定義,所以直接提供了方法。不過所幸裡面用的是JdkSerializer,所以這個定義了什麼類型的泛型都不會產生運行異常。

    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這兩個,調用了不同的序列化方法。進行方法查看,看到序列化hashkey用的是template裡的hashkeyserializer,預設是jdkserializer,這個會導致在redis控制台,看不出來存了什麼key。如果不喜歡,可以通過redistemplate.sethashkeyserializer()來進行設定。

 

 對於hash結構所有的api,也都在這個類裡進行了封裝,比如hset變為了put,hget變為get。需要自行去查看api。不要被誤導。

 

4. 總結

到這裡為止,已經把基本的使用都說完了。說的很粗糙,只是把我覺得容易出現誤解的點進行了重點說明,基礎的操作還需要大家自己稍微看下。權作一個拋磚引玉的作用吧。接下來,可能會總結下在這兩個月用Redis遇到的一些問題進行說明。

 

 

我把代碼放在了git上,地址是https://github.com/55375829/learn,裡面spjedis就是當時自己學習時候建的項目。

深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作類訪問Redis

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.