如何使用Redis實現排行榜功能

下面由redis教程欄目給大家介紹使用redis實現排行榜功能的方法,希望對需要的朋友有所幫助!

如何使用Redis實現排行榜功能

排行榜功能是一個很普遍的需求。使用 redis教程 中有序集合的特性來實現排行榜是又好又快的選擇。

一般排行榜都是有實效性的,比如“用戶積分榜”。如果沒有實效性一直按照總榜來排,可能榜首總是幾個老用戶,對于新用戶來說,那真是太令人沮喪了。

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

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

ZINCRBY?rank:20150401?5?1

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

ZINCRBY?rank:20150401?1?2 ZINCRBY?rank:20150401?10?3

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

ZRANGE?rank:20150401?0?-1?withscores
1)?"2" 2)?"1" 3)?"1" 4)?"5" 5)?"3" 6)?"10"

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

ZREVRANGE?rank:20150401?0?9?withscores
1)?"3" 2)?"10" 3)?"1" 4)?"5" 5)?"2" 6)?"1"

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

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

ZREVRANGE?rank:20150331?0?9?withscores

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

ZUNIONSTORE?rank:last_week?7?rank:20150323?rank:20150324?rank:20150325?rank:20150326?rank:20150327?rank:20150328?rank:20150329?WEIGHTS?1?1?1?1?1?1?1

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

ZREVRANGE?rank:last_week??0?9?withscores

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

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享