近來在項目中有用到Spring Data Redis,順便研究了一下API,中間仍是有些許坑的。因爲前期有接觸過Jedis和Reddison,因此對Redis的數據結構並不陌生,上手仍是很快的。本文主要是記錄了本身研究API的一些單元測試以及一些須要注意的點,對Redis數據結構不太清晰的小夥伴得先補充數據結構這塊的知識點。下面我將分別對String、Hash、List、Set、ZSet
這五種數據結構操做的API進行講解。git
PS:因爲在RedisTemplate
中,ValueOperations
和BoundValueOperations
這種都是一一對應的關係。BoundValueOperations
只不過是先綁定key
,再進行操做的,因此本文會着重分析ValueOperations
這樣的操做類的API。github
從名字上來看,大概能夠猜想出這個類是操做String
數據類型的操做類。
這裏我會介紹大部分API的使用,以及能夠用在什麼領域。我們先從set
設置值這一塊開始:redis
簡單的set
,還有包含過時時間的set
,還有在JDK1.8中常常出現的xxxIfAbsent
,我們在這裏能夠用其配合設置過時時間來實現分佈式鎖,存在即返回false
,證實有線程持有鎖,不存在則獲取鎖。spring
這個用來操做位Bit
,值只能爲boolean
類型。Guava
中能夠實現單機部署的布隆過濾器。這裏應該能夠實現集羣狀況下的布隆過濾器。固然,這裏只是個猜想,沒有去實踐,感興趣的朋友能夠自行實踐一下。數據結構
同時,該API還爲咱們提供了多鍵值對插入以及同時取出多個鍵對應的值的方法·multiSet
和multiGet
。
app
下面介紹的set(key,value.offset)
和append(key,value)
這兩個方法必須得放到一塊兒介紹,這也是在學習中踩到的第一個坑,這兩個方法都是追加的意思,一個是在指定的偏移位置進行追加,一個直接在後面進行追加。
分佈式
redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer());
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize;....
。經過去官網查詢
append指令的使用,上面會介紹:
If
key
already exists and is a string, this command appends thevalue
at the end of the string. Ifkey
does not exist it is created and set as an empty string, so APPEND will be similar to SET in this special case.單元測試
因此,使用的時候,須要加上String類型的序列化和反序列化設置。否則會默認使用JdkSerializationRedisSerializer
進行序列化。學習
ValueOperations
這個類的操做大概就介紹到這裏,下面介紹一下ListOperations
的一些基本操做。測試
測試的時候發現,這種鏈表結構在Redis中進行存儲時,當鏈表中的元素所有被取出的時候,Redis是不會維護一個空隊列的,它會將與list
關聯的key
給移除掉。
首先是簡單的存取操做,push
和pop
。
接着是遍歷操做,這裏注意一下,也許會成爲你的第二個坑,這裏的遍歷調用的是LRANGE指令,並非pop指令
,因此,並不會移除隊列中的數據。
接着介紹一下基操,index
和size
,這裏不用多介紹,基本和JDK中的List
相似的操做。
最後介紹下Remove
操做,這裏比較有趣,先看一下移除操做的具體實現:
注意下我上面的註釋,當第三個參數count > 0
時,它會正向遍歷去移除元素,即從head——>tail
,當count < 0
時,則會逆向遍歷移除元素,即從tail——>head
。而且這兩種方法移除元素的數目爲count
值的大小。當count = 0
時,則會直接移除全部等於value
值的元素,這裏默認是正向遍歷。而後三個方法的返回都是移除元素的個數。這裏你們本身試驗一下就知道了,不是很複雜~~
這裏介紹的不算太多,但基本覆蓋了全部的使用,例如rightPush
和leftPush
等等相似的API,相信你們只用看一個基本就能所有領會了。
這個操做類主要介紹一下設定值set
方法和獲得全部存儲數據entrie
以及批量查詢multiGet
,其實相似的API已經在ListOperations
中有過介紹了,這裏我們經過幾個簡單的單元測試一筆帶過。
簡單三部曲,增長add
,取出pop
以及獲取數量size
。
支持求差集difference
,能夠用來實現本身特有的功能。例如甲乙都有興趣愛好,要想獲得甲單獨的興趣則能夠用此API來實現。
求交集intersect
,能夠用來實現共同好友的功能,後面還有求並集union
的API,使用起來和前兩個並沒有太大的區別。
轉儲這個功能在差集、交集、並集中都有相應的實現方法,即將結果存儲到另外一個key中。
帶有member
這種相似的API和pop
不太同樣,這種都不會改變原隊列。與之關聯的幾個方法我下面的截圖上都有註釋,不作過多解釋。
這裏主要介紹下range
和rank
這個方法,因爲zset
結構咱們在上面進行數據填充的時候都有指定一個score
,這個score
就是用來內部進行排序的。range
能夠供咱們去進行一個範圍查詢,rank
則可讓咱們知道須要查詢的元素在隊列中處於什麼位置。同時還提供reverseRank
讓咱們查詢反序後元素的具體位置。
這些東西也不是很難理解,主要是熟悉一下基本的API操做,有些東西也沒整理太全,好比scan
方法,測試結果與預期不是很一致,過濾正則感受沒生效,這裏就暫時不作介紹了,後期有時間繼續再研究一下。本文的測試案例都在github中。