1. 程式人生 > >有序排行榜的工具類,redis的opsForZset

有序排行榜的工具類,redis的opsForZset

最近接了一個遊戲需求,裡面有個點就是排行榜。

如果自己用佇列,然後針對每條插入資料都進行排序,顯然很低效。之前看過redis支援的型別有5中,String,list,set,sortedSet,map。剛好這次可以用一下sortedSet這個有序集合

關於redis的配置,我有空會在另外一個章節裡面梳理下,其實不大喜歡寫配置,因為網上一大堆,這一章主要講解一下opsForZset的幾個方法。

1、先看它的add方法,Boolean add(K key, V value, double score);

這個有序佇列的結構就是Key,Value,Score

key就是這個有序佇列的key,

value表示一個你需要排序附帶的值,比如你可以放一個使用者的ID或者其他的。

Score表示一個分數,所有的排序都是基於這個score。可以正序排列,也可以倒敘排列。

2、Set< V > range(K key, long start, long end);  正序

Set reverseRange(K key, long start, long end);倒敘

獲取佇列的方法,start表示起始位置的index,從0開始。index表示end的位置,-1表示獲取全部

opsForZSet.range("key",0,-1),表示獲取key佇列的所有元素。

對應的方法還有幾個

Set< TypedTuple< V >> rangeWithScores(K key, long start, long end);

Set< TypedTuple< V >> reverseRangeWithScores(K key, long start, long end);

這兩個方法跟上面的方法差不多,只是返回的時候迴帶上score,有時候業務需要輸出這個score,比如排行榜的分數,你就可以用2個這個。

3、

Set< V > rangeByScore(K key, double min, double max);

Set< V > reverseRangeByScore(K key, double min, double max);

這倆方法表示在某個分數區間內的集合。min表示最小的分數,max表示最大的分數,集合返回在min和max之間的集合有哪些。

業務場景:比如某個分數區間內的使用者數量統計,或者對這些使用者給予一些獎勵。具體就不贅述了。

類似的方法如下

Set< TypedTuple< V >> rangeByScoreWithScores(K key, double min, double max);

Set< TypedTuple< V >> rangeByScoreWithScores(K key, double min, double max, long offset, long count);

Set< TypedTuple< V >> reverseRangeByScoreWithScores(K key, double min, double max);

Set< V > reverseRangeByScore(K key, double min, double max, long offset, long count);

Set< TypedTuple< V >> reverseRangeByScoreWithScores(K key, double min, double max, long offset, long count);

這幾個方法比較類似,要麼是倒敘,要麼是對返回物件進行了限制輸出,加上了offset,count來限制輸出的物件,就是類似於資料庫的limit,offset。

4、

Long size(K key);

Long zCard(K key);

這兩方法表示的都是這個佇列的長度,不知道為啥要寫倆個,size()底層就是呼叫的zCard()

5、

Long unionAndStore(K key, K otherKey, K destKey);

Long unionAndStore(K key, Collection< K > otherKeys, K destKey);

這兩個方法挺有意思的,意思不僅僅是去重,而且會把重複的資料score進行相加,返回值是這個集合的長度

先解釋第一個,key,otherKey這兩個key的有序佇列進行相加,如果兩個佇列中存在相同的value,就將value的score相加,最終將最後的組合結果放到destKey中。

第二個方法則是多了一個集合引數,多個集合可以用同一個方法,節省程式碼,舉個簡單的例子:

Long unionAndStore2 = opsForZSet.unionAndStore("A", Arrays.asList("B","C"), "D");

6、

Long intersectAndStore(K key, K otherKey, K destKey);

Long intersectAndStore(K key, Collection< K > otherKeys, K destKey);

這倆方法剛好和上面2個方法相反,這個是交集。把交集的結果放到destKey中

7、

Cursor< TypedTuple< V >> scan(K key, ScanOptions options);

這方法自己用的時候,發現跟interator基本上一樣,就是用來遍歷這個key的集合裡面的所有元素的。

方法基本上自己都跑過用過,本來想貼上程式碼,但是真的不是特別喜歡,因為一兩句話就能搞定的意思,非要讓別人又看一遍原始碼重新理解一遍,不是特別喜歡。