有序排行榜的工具類,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的集合裡面的所有元素的。
方法基本上自己都跑過用過,本來想貼上程式碼,但是真的不是特別喜歡,因為一兩句話就能搞定的意思,非要讓別人又看一遍原始碼重新理解一遍,不是特別喜歡。