主頁(yè) > 知識(shí)庫(kù) > 使用Redis實(shí)現(xiàn)用戶積分排行榜的教程

使用Redis實(shí)現(xiàn)用戶積分排行榜的教程

熱門標(biāo)簽:隨州營(yíng)銷電話機(jī)器人怎么樣 400電話申請(qǐng)?jiān)趺纯?/a> 400電話從哪里申請(qǐng)濱州 天音通信電話機(jī)器人 杭州400電話如何申請(qǐng)的 機(jī)器人電話機(jī)創(chuàng)意繪畫 江西南昌百應(yīng)電話機(jī)器人 高德地圖標(biāo)注商家在哪 hbuilder地圖標(biāo)注

排行榜功能是一個(gè)很普遍的需求。使用 Redis 中有序集合的特性來實(shí)現(xiàn)排行榜是又好又快的選擇。

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

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

那么用戶增加積分時(shí),都操作一下記錄當(dāng)天積分增加的有序集合。
假設(shè)今天是 2015 年 04 月 01 日,UID 為 1 的用戶因?yàn)槟硞€(gè)操作,增加了 5 個(gè)積分。
Redis 命令如下:

ZINCRBY rank:20150401 5 1

假設(shè)還有其他幾個(gè)用戶也增加了積分:

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

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

ZRANGE rank:20150401 0 -1 withscores

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

按照分?jǐn)?shù)從高到低,獲取 top10:

ZREVRANGE rank:20150401 0 9 withscores

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

因?yàn)橹挥腥齻€(gè)元素,所以就查詢出了這些數(shù)據(jù)。

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

ZREVRANGE rank:20150331 0 9 withscores

利用并集實(shí)現(xiàn)多天的積分總和,實(shí)現(xiàn)“上周積分榜”:

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 中了。權(quán)重因子 WEIGHTS 如果不給,默認(rèn)就是 1。為了不隱藏細(xì)節(jié),特意寫出。
那么查詢上周積分榜 Top10 的信息就是:

ZREVRANGE rank:last_week 0 9 withscores

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

下面給出一個(gè) PHP 版的簡(jiǎn)單實(shí)現(xiàn)。使用 Redis 依賴于 PHP 擴(kuò)展 PhpRedis,代碼還依賴于 Carbon 庫(kù),用于處理時(shí)間。代碼量很少,所以就不敲注釋了。

?php

namespace 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);

您可能感興趣的文章:
  • Java簡(jiǎn)單使用redis-zset實(shí)現(xiàn)排行榜
  • 使用Redis實(shí)現(xiàn)微信步數(shù)排行榜功能
  • redis實(shí)現(xiàn)排行榜的簡(jiǎn)單方法
  • 利用redis實(shí)現(xiàn)排行榜的小秘訣
  • 利用Redis的有序集合實(shí)現(xiàn)排行榜功能實(shí)例代碼
  • 基于redis實(shí)現(xiàn)世界杯排行榜功能項(xiàng)目實(shí)戰(zhàn)
  • redis實(shí)現(xiàn)排行榜功能

標(biāo)簽:葫蘆島 招商 保定 鶴崗 石嘴山 沈陽(yáng) 昆明 常德

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用Redis實(shí)現(xiàn)用戶積分排行榜的教程》,本文關(guān)鍵詞  使用,Redis,實(shí)現(xiàn),用戶,積分,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用Redis實(shí)現(xiàn)用戶積分排行榜的教程》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于使用Redis實(shí)現(xiàn)用戶積分排行榜的教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章