sorted set 資料型別的應用場景

Leon_Jinhai_Sun發表於2020-09-26

1.簡介

  在 set 的基礎上給集合中每個元素關聯了一個分數,往有序集合中插入資料時會自動根據這個分數排序。它保留了元素不能重複的特性,並且元素是有序的。

2.基本操作

zadd key score member  //score是可以重複的,新增key的時候指定分數
zcard key //計算成員個數
zscore key member //計算某個成員的分數
zrank key member //計算成員排名,從低到高
zrevrank key member //計算成員排名,從高到低
zrem key member [member...]  //刪除成員
zincrby key increnment member //增加成員的分數
zrange key start end [withscores]  //從低到高返回指定排名的分數
zrevrange key start end [withscores]  //從高到低返回

zrangebyscore key min max [withscores] [limit offset count] //按照分數從低到高返回
zrevrange score  key min max [withscores] [limit offset count] //按照分數從高到低返回成員

withscore 代表返回的時候帶上成員的分數

...還有求交集,並集等操作

3.應用場景

  在集合型別的場景上加入排序就是有序集合的應用場景了。

(1)根據好友的“親密度”排序顯示好友列表。

// 用元素的分數(score)表示與好友的親密度
zadd user:kobe 80 james 90 wade  85 melo  90 paul

// 根據“親密度”給好友排序
zrevrange user:kobe 0 -1

/**
 * 輸出:
 *      1) "wade"
 *      2) "paul"
 *      3) "melo"
 *      4) "james"
 */
 
// 增加好友的親密度
zincrby user:kobe 15 james

// 再次根據“親密度”給好友排序
zrevrange user:kobe 0 -1

/**
 * 輸出:
 *      1) "james"
 *      2) "wade"
 *      3) "paul"
 *      2) "melo"
 */
 
 //類似的需求還出現在根據文章的閱讀量或點贊量對文章列表排序

(2)排行榜

實效性

從排行榜的實效性上劃分,主要分為:

  • 實時榜:基於當前一段時間內資料的實時更新,進行排行。例如:當前一小時內遊戲熱度實時榜,當前一小時內明星送花實時榜等

  • 歷史榜:基於歷史一段週期內的資料,進行排行。例如:日榜(今天看昨天的),周榜(上一週的),月榜(上個月的),年榜(上一年的)

業務資料型別

從需要排行的資料型別上劃分,主要分為:

  • 單型別資料排行榜:是指需要排行的主體不需要區分型別,例如,所有使用者積分排行,所有公貢獻值排行,所有遊戲熱度排行等

  • 多型別(複合型別)資料排行榜:是指需要排行的主體在排行中要求有型別上的區分,例如:競技類遊戲熱度排行、體育類遊戲熱度排行、MOBA類遊戲操作性排行、角色/回合/卡牌三類遊戲熱度排行等

展示唯度

從榜單的最終展示唯度上劃分,主要分為:

  • 單唯度:是指選擇展示的排行榜就是基於一個唯度下的排行,例如前面提到的MOBA類遊戲操作性排行榜,就僅展示所有MOBA類遊戲按操作性的評分排行

  • 多唯度:是指選擇展示的排行榜還有多種唯度供使用者選擇,仍然以前面的MOBA類遊戲為例,唯度除了操作性,還有音效評分排行,難易度評分排行,畫面評分排行等。

展示資料量

從需要展示的資料量上劃分,主要分為:

  • topN資料:只要求展示topN條排行紀錄,例如:最火MOBA遊戲top20

  • 全量資料:要求展示所有資料的排行,例如:所有使用者的積分排行

 

 

 

相關文章