首頁 > Java > java教程 > 主體

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

巴扎黑
發布: 2016-11-09 13:53:21
原創
2137 人瀏覽過

排行榜功能是一個很普遍的需求。使用 Redis 中有序集合的特性來實現排行榜是又好又快的選擇。 
一般排行榜都是有實效性的,例如「用戶積分榜」。如果沒有實效性一直按照總榜來排,可能榜首總是幾個老用戶,對於新用戶來說,那真是太令人沮喪了。 
首先,來個「今日積分榜」吧,排序規則是今日用戶新增積分從多到少。 
那麼使用者增加積分時,都會操作一下記錄當天積分增加的有序集合。 
假設今天是 2015 年 04 月 01 日,UID 為 1 的使用者因為某個操作,增加了 5 個積分。
Redis 指令如下: 
ZINCRBY rank:20150401 5 1 
假設還有其他幾個使用者也增加了積分: 
ZINCRBY rank:20150401 1 2ZINCRBY rank:2015001 (withscores 參數可附帶取得元素的score): 
ZRANGE rank:20150401 0 -1 withscores1) "2"2) "1"3) "1"4) "5"5) "3"6) "10" 
#p#分頁標題#e# 
依照分數從高到低,取得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 rank2015023015025025:5015:5025025025:5015:5025025025 rank:20150326 rank:20150327 rank:20150328 rank:20150329 WEIGHTS 1 1 1 1 1 1 1 
這樣就將7 天的積分記錄合併到有序集合k:last_week 中了。權重因數 WEIGHTS 如果不給,預設就是 1。為了不隱藏細節,特意寫出。 
那麼查詢上週積分榜 Top10 的資訊是: 
ZREVRANGE rank:last_week 0 9 withscores#p#分頁標題#e# 
「月榜」、「季度榜」、「年度榜」等等就以此類推。 
下面給出一個 PHP 版的簡單實作。使用 Redis 依賴 PHP 擴充 PhpRedis,程式碼也依賴 Carbon 函式庫,用於處理時間。程式碼量很少,所以就不敲註解了。 


<?php
namespace BlogRedis;
use Redis;
use CarbonCarbon;class Ranks { 
 const PREFIX = &#39;rank:&#39;; 
protected $redis = null;  
public function __construct(Redis $redis) { 
   $this->redis = $redis; 
 } 
 public function addScores($member, $scores) {  
  $key = self::PREFIX . date(&#39;Ymd&#39;);  
  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);
登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板