Spring Data Redis的基本使用和應(yīng)用場(chǎng)景

前言

近來(lái)在項(xiàng)目中有用到Spring Data Redis,順便研究了一下API,中間還是有些許坑的。由于前期有接觸過(guò)Jedis和Reddison,所以對(duì)Redis的數(shù)據(jù)結(jié)構(gòu)并不陌生,上手還是很快的。本文主要是記錄了自己研究API的一些單元測(cè)試以及一些需要注意的點(diǎn),對(duì)Redis數(shù)據(jù)結(jié)構(gòu)不太清晰的小伙伴得先補(bǔ)充數(shù)據(jù)結(jié)構(gòu)這塊的知識(shí)點(diǎn)。下面我將分別對(duì)String、Hash、List、Set、ZSet這五種數(shù)據(jù)結(jié)構(gòu)操作的API進(jìn)行講解。


PS:由于在RedisTemplate中,ValueOperationsBoundValueOperations這種都是一一對(duì)應(yīng)的關(guān)系。BoundValueOperations只不過(guò)是先綁定key,再進(jìn)行操作的,所以本文會(huì)著重分析ValueOperations這樣的操作類(lèi)的API。

ValueOperations操作

從名字上來(lái)看,大概可以猜測(cè)出這個(gè)類(lèi)是操作String數(shù)據(jù)類(lèi)型的操作類(lèi)。
這里我會(huì)介紹大部分API的使用,以及可以用在什么領(lǐng)域。咱們先從set設(shè)置值這一塊開(kāi)始:

簡(jiǎn)單的set,還有包含過(guò)期時(shí)間的set,還有在JDK1.8中經(jīng)常出現(xiàn)的xxxIfAbsent,咱們?cè)谶@里可以用其配合設(shè)置過(guò)期時(shí)間來(lái)實(shí)現(xiàn)分布式鎖,存在即返回false,證明有線程持有鎖,不存在則獲取鎖。

這個(gè)用來(lái)操作位Bit,值只能為boolean類(lèi)型。Guava中可以實(shí)現(xiàn)單機(jī)部署的布隆過(guò)濾器。這里應(yīng)該可以實(shí)現(xiàn)集群情況下的布隆過(guò)濾器。當(dāng)然,這里只是個(gè)猜測(cè),沒(méi)有去實(shí)踐,感興趣的朋友可以自行實(shí)踐一下。

同時(shí),該API還為我們提供了多鍵值對(duì)插入以及同時(shí)取出多個(gè)鍵對(duì)應(yīng)的值的方法·multiSetmultiGet

下面介紹的set(key,value.offset)append(key,value)這兩個(gè)方法必須得放到一起介紹,這也是在學(xué)習(xí)中踩到的第一個(gè)坑,這兩個(gè)方法都是追加的意思,一個(gè)是在指定的偏移位置進(jìn)行追加,一個(gè)直接在后面進(jìn)行追加。


細(xì)心的同學(xué)看到我上面的代碼段,會(huì)發(fā)現(xiàn)多出了
redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer());
這兩個(gè)序列化的設(shè)置,如果你不設(shè)置,進(jìn)行調(diào)用時(shí)會(huì)給你報(bào)一個(gè)無(wú)法進(jìn)行反序列化的異常,org.springframework.data.redis.serializer.SerializationException: Cannot deserialize;....。通過(guò)去官網(wǎng)查詢(xún)append指令的使用,上面會(huì)介紹:

If key already exists and is a string, this command appends the value at the end of the string. If key does not exist it is created and set as an empty string, so APPEND will be similar to SET in this special case.

所以,使用的時(shí)候,需要加上String類(lèi)型的序列化和反序列化設(shè)置。不然會(huì)默認(rèn)使用JdkSerializationRedisSerializer進(jìn)行序列化。

ValueOperations這個(gè)類(lèi)的操作大概就介紹到這里,下面介紹一下ListOperations的一些基本操作。


ListOperations操作

測(cè)試的時(shí)候發(fā)現(xiàn),這種鏈表結(jié)構(gòu)在Redis中進(jìn)行存儲(chǔ)時(shí),當(dāng)鏈表中的元素全部被取出的時(shí)候,Redis是不會(huì)維護(hù)一個(gè)空隊(duì)列的,它會(huì)將與list關(guān)聯(lián)的key給移除掉。

首先是簡(jiǎn)單的存取操作,pushpop

接著是遍歷操作,這里注意一下,也許會(huì)成為你的第二個(gè)坑,這里的遍歷調(diào)用的是LRANGE指令,并不是pop指令,所以,并不會(huì)移除隊(duì)列中的數(shù)據(jù)。

接著介紹一下基操,indexsize,這里不用多介紹,基本和JDK中的List類(lèi)似的操作。

最后介紹下Remove操作,這里比較有趣,先看一下移除操作的具體實(shí)現(xiàn):

注意下我上面的注釋?zhuān)?dāng)?shù)谌齻€(gè)參數(shù)count > 0時(shí),它會(huì)正向遍歷去移除元素,即從head——>tail,當(dāng)count < 0時(shí),則會(huì)逆向遍歷移除元素,即從tail——>head。并且這兩種方法移除元素的數(shù)目為count值的大小。當(dāng)count = 0時(shí),則會(huì)直接移除所有等于value值的元素,這里默認(rèn)是正向遍歷。然后三個(gè)方法的返回都是移除元素的個(gè)數(shù)。這里大家自己試驗(yàn)一下就知道了,不是很復(fù)雜~~

這里介紹的不算太多,但基本覆蓋了所有的使用,例如rightPushleftPush等等類(lèi)似的API,相信大家只用看一個(gè)基本就能全部領(lǐng)會(huì)了。


HashOperations操作

這個(gè)操作類(lèi)主要介紹一下設(shè)定值set方法和得到所有存儲(chǔ)數(shù)據(jù)entrie以及批量查詢(xún)multiGet,其實(shí)類(lèi)似的API已經(jīng)在ListOperations中有過(guò)介紹了,這里咱們通過(guò)幾個(gè)簡(jiǎn)單的單元測(cè)試一筆帶過(guò)。




SetOperations操作

簡(jiǎn)單三部曲,增加add,取出pop以及獲取數(shù)量size。

支持求差集difference,可以用來(lái)實(shí)現(xiàn)自己特有的功能。例如甲乙都有興趣愛(ài)好,要想得到甲單獨(dú)的興趣則可以用此API來(lái)實(shí)現(xiàn)。

求交集intersect,可以用來(lái)實(shí)現(xiàn)共同好友的功能,后面還有求并集union的API,使用起來(lái)和前兩個(gè)并無(wú)太大的區(qū)別。
轉(zhuǎn)儲(chǔ)這個(gè)功能在差集、交集、并集中都有相應(yīng)的實(shí)現(xiàn)方法,即將結(jié)果存儲(chǔ)到另一個(gè)key中。

帶有member這種類(lèi)似的API和pop不太一樣,這種都不會(huì)改變?cè)?duì)列。與之關(guān)聯(lián)的幾個(gè)方法我下面的截圖上都有注釋?zhuān)蛔鲞^(guò)多解釋。


ZSetOperations

這里主要介紹下rangerank這個(gè)方法,由于zset結(jié)構(gòu)我們?cè)谏厦孢M(jìn)行數(shù)據(jù)填充的時(shí)候都有指定一個(gè)score,這個(gè)score就是用來(lái)內(nèi)部進(jìn)行排序的。range可以供我們?nèi)ミM(jìn)行一個(gè)范圍查詢(xún),rank則可以讓我們知道需要查詢(xún)的元素在隊(duì)列中處于什么位置。同時(shí)還提供reverseRank讓我們查詢(xún)反序后元素的具體位置。


總結(jié)

這些東西也不是很難理解,主要是熟悉一下基本的API操作,有些東西也沒(méi)整理太全,比如scan方法,測(cè)試結(jié)果與預(yù)期不是很一致,過(guò)濾正則感覺(jué)沒(méi)生效,這里就暫時(shí)不做介紹了,后期有時(shí)間繼續(xù)再研究一下。本文的測(cè)試案例都在github中。


END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容