Redis 實現日排行榜,周排行榜算法

首先,來個“今日積分榜”吧,排序規則是今日用戶新增積分從多到少。

那麼用戶增加積分時,都操作一下記錄當天積分增加的有序集合。 假設今天是 2017 年 03 月 01 日,UID 爲 1 的用戶因爲某個操作,增加了 5 個積分。 Redis 命令如下:

ZINCRBY rank:20170301 5 1

假設還有其他幾個用戶也增加了積分:

ZINCRBY rank:20170301 1 2 

ZINCRBY rank:20170301 10 3

看看現在有序集合 rank:20170301 中的數據(withscores 參數可以附帶獲取元素的 score):

ZRANGE rank:20170301 0 -1 withscores

1)"2" 2)"1" 3)"1" 4)"5" 5)"3" 6)"10"

按照分數從高到低,獲取 top10:

ZREVRANGE rank:20170301 0 9 withscores

1)"3" 2)"10" 3)"1" 4)"5" 5)"2" 6)"1"

因爲只有三個元素,所以就查詢出了這些數據。

如果每天記錄當天的積分排行榜,那麼其他花樣百出的榜單也就簡單了。 比如“昨日積分榜”:

ZREVRANGE rank:20170228 0 9 withscores

利用並集實現多天的積分總和,實現“上週積分榜”:

ZUNIONSTORE rank:last_week 7 rank:20170220 rank:20170221 rank:20170222 rank:20170223 rank:20170224 rank:20170225 rank:20170226 WEIGHTS 1 1 1 1 1 1 1

這樣就將 7 天的積分記錄合併到有序集合 rank:last_week 中了。權重因子 WEIGHTS 如果不給,默認就是 1。爲了不隱藏細節,特意寫出。 那麼查詢上週積分榜 Top10 的信息就是:

ZREVRANGE rank:last_week 0 9 withscores

“月度榜”、“季度榜”、“年度榜”等等就以此類推。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章