spring使用RedisTemplate的操作類訪問Redis
事務(wù)需要開啟enableTransactionSupport,然后使用@transactional注解,里面直接通過回調(diào)的connection,就不需要自己進(jìn)行multi和exec的事務(wù)開啟提交了。但是通過回調(diào)去獲取connection,完全沒有達(dá)到一個模版類的功能。所以這篇我們會講下幾種Operations接口提供的方法。
private ValueOperations<K, V> valueOps; private ListOperations<K, V> listOps; private SetOperations<K, V> setOps; private ZSetOperations<K, V> zSetOps;
1. RedisOperations接口說明
這個接口的實(shí)現(xiàn)類就是RedisTemplate本身,主要提供了一些對Redis鍵,事務(wù),運(yùn)行腳本等命令的支持,不負(fù)責(zé)數(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); }
這個是事務(wù)的監(jiān)視命令,可以看出,里面的實(shí)現(xiàn)也是用的回調(diào)RedisCallback。這些api都是通過connection的api來進(jìn)行了封裝。
2. ValueOperations接口說明
這個接口的實(shí)現(xiàn)類為DefaultValueOperations,default這個類同時(shí)繼承AbstractOperation,我們來看下這個類的構(gòu)造函數(shù):
DefaultValueOperations(RedisTemplate<K, V> template) { super(template); }
非公開的,需要傳入template來構(gòu)造。但是我們是無法訪問的。不過不要急,在RedisTemplate中,已經(jīng)提供了一個工廠方法:opsForValue()。這個方法會返回一個默認(rèn)的操作類。另外,我們可以直接通過注解@Resource(name = "redisTemplate")來進(jìn)行注入。
@Resource(name = "redisTemplate") private ValueOperations<String, Object> vOps;
是不是很奇怪,毫無父子兄弟關(guān)系的兩個類,怎么能互相注入呢?這個是Spring的Editor機(jī)制,搜索下ValueOperationsEditor這個類就知道了,Spring在注入的時(shí)候調(diào)用了Editor的setValue方法。了解Spring源碼的應(yīng)該知道。我也是看別人的文章才理解的。
其實(shí)除了可以通過template注入ValueOperations,還可以注入 上面的其他幾種operations以及HashOperations.
DefaultValueOperations提供了所有Redis字符串類型的操作api。比如set,get,incr等等。使用這些方法,可以方便的直接存儲任意的java類型,而不需要自己去將存儲的東西序列化以及反序列化。
注意:泛型的類型,以及序列化器都是來自RedisTemplate。如果要自行進(jìn)行json或者其他的序列化,就需要在RedisTemplate中進(jìn)行更改。
另外,對于成員listOps,setOps,zSetOps這接個操作類,就不再贅述,原理同ValueOperations,是其他幾種數(shù)據(jù)類型的實(shí)現(xiàn)。
3. HashOperations接口說明
這個接口并沒有定義成員變量,猜測是因?yàn)閷τ贖ash來說,又增加了額外的Key和Value,泛型無法在成員前額外定義,所以直接提供了方法。不過所幸里面用的是JdkSerializer,所以這個定義了什么類型的泛型都不會產(chǎn)生運(yù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)用了不同的序列化方法。進(jìn)行方法查看,看到序列化hashkey用的是template里的hashkeyserializer,默認(rèn)是jdkserializer,這個會導(dǎo)致在redis控制臺,看不出來存了什么key。如果不喜歡,可以通過redistemplate.sethashkeyserializer()來進(jìn)行設(shè)置。
對于hash結(jié)構(gòu)所有的api,也都在這個類里進(jìn)行了封裝,比如hset變?yōu)榱藀ut,hget變?yōu)間et。需要自行去查看api。不要被誤導(dǎo)。
4. 總結(jié)
到這里為止,已經(jīng)把基本的使用都說完了。說的很粗糙,只是把我覺得容易出現(xiàn)誤解的點(diǎn)進(jìn)行了重點(diǎn)說明,基礎(chǔ)的操作還需要大家自己稍微看下。權(quán)作一個拋磚引玉的作用吧。接下來,可能會總結(jié)下在這兩個月用Redis遇到的一些問題進(jìn)行說明。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot 異步線程間數(shù)據(jù)傳遞的實(shí)現(xiàn)
本文主要介紹了SpringBoot 異步線程間數(shù)據(jù)傳遞的實(shí)現(xiàn),包括異步線程的基本概念、數(shù)據(jù)傳遞的方式、具體實(shí)現(xiàn)方式等,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03SpringBoot整合Kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼加減乘除功能
在開發(fā)Web應(yīng)用時(shí),驗(yàn)證碼是一個常見的功能,它可以幫助我們防止機(jī)器人的惡意操作,今天我們將學(xué)習(xí)如何使用Kaptcha生成圖片驗(yàn)證碼,并自定義驗(yàn)證碼內(nèi)容為100以內(nèi)的加減乘除運(yùn)算,感興趣的朋友跟隨小編一起看看吧2024-07-07又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用
網(wǎng)絡(luò)數(shù)據(jù)的基本單位永遠(yuǎn)是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過于復(fù)雜,有點(diǎn)難用.本篇文章就帶大家簡單了解一下 ,需要的朋友可以參考下2021-06-06JAVA多線程與并發(fā)學(xué)習(xí)總結(jié)分析
以下是對小編對JAVA多線程與并發(fā)的學(xué)習(xí)進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下2013-08-08java的poi技術(shù)讀取和導(dǎo)入Excel實(shí)例
本篇文章主要介紹了java的poi技術(shù)讀取和導(dǎo)入Excel實(shí)例,報(bào)表輸出是Java應(yīng)用開發(fā)中經(jīng)常涉及的內(nèi)容,有需要的可以了解一下。2016-11-11基于java socket實(shí)現(xiàn) 聊天小程序
這篇文章主要介紹了基于java socket實(shí)現(xiàn) 聊天小程序,代碼分為服務(wù)器和客戶端,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Springboot集成spring data elasticsearch過程詳解
這篇文章主要介紹了springboot集成spring data elasticsearch過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java 中HashCode作用_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java 中HashCode作用以及hashcode對于一個對象的重要性,對java中hashcode的作用相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2017-05-05