国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Redis > 正文

使用Redis實現用戶積分排行榜的教程

2020-10-28 21:41:26
字體:
來源:轉載
供稿:網友

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

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

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

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

ZINCRBY rank:20150401 5 1

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

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

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

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

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

ZREVRANGE rank:20150401 0 9 withscores1) "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

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

下面給出一個 PHP 版的簡單實現。使用 Redis 依賴于 PHP 擴展 PhpRedis,代碼還依賴于 Carbon 庫,用于處理時間。代碼量很少,所以就不敲注釋了。

<?phpnamespace Blog/Redis;use /Redis;use Carbon/Carbon;class Ranks {  const PREFIX = 'rank:';  protected $redis = null;  public function __construct(Redis $redis) {    $this->redis = $redis;  }  public function addScores($member, $scores) {    $key = self::PREFIX . date('Ymd');    return $this->redis->zIncrBy($key, $scores, $member);  }  protected function getOneDayRankings($date, $start, $stop) {    $key = self::PREFIX . $date;    return $this->redis->zRevRange($key, $start, $stop, true);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 特克斯县| 泰顺县| 托克托县| 枝江市| 沙洋县| 苍溪县| 海南省| 嘉善县| 绵阳市| 雅江县| 金平| 余姚市| 八宿县| 临洮县| 安新县| 永胜县| 平果县| 五指山市| 密山市| 科技| 高碑店市| 苏尼特右旗| 泽库县| 安溪县| 章丘市| 犍为县| 九龙坡区| 贺兰县| 西昌市| 越西县| 天全县| 通州市| 东丽区| 墨脱县| 景洪市| 深泽县| 高尔夫| 甘南县| 郓城县| 新沂市| 海城市|