使用 Redis 實現排行榜功能

2021-09-20 02:55:46 字數 2378 閱讀 2851

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

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

首先,來個「今日積分榜」吧,排序規則是今日使用者新增積分從多到少。

那麼使用者增加積分時,都操作一下記錄當天積分增加的有序集合。

假設今天是 2015 年 04 月 01 日,uid 為 1 的使用者因為某個操作,增加了 5 個積分。

redis 命令如下:

bashzincrby rank:20150401 5 1
假設還有其他幾個使用者也增加了積分:

bashzincrby rank:20150401 1 2

zincrby rank:20150401 10 3

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

bashzrange rank:20150401 0 -1 withscores
bash1) "2"

2) "1"

3) "1"

4) "5"

5) "3"

6) "10"

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

bashzrevrange rank:20150401 0 9 withscores
bash1) "3"

2) "10"

3) "1"

4) "5"

5) "2"

6) "1"

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

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

比如「昨日積分榜」:

bashzrevrange rank:20150331 0 9 withscores
利用並集實現多天的積分總和,實現「上週積分榜」:

bashzunionstore 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 的資訊就是:

bashzrevrange rank:last_week  0 9 withscores
「月度榜」、「季度榜」、「年度榜」等等就以此類推。

下面給出乙個 php 版的簡單實現。使用 redis 依賴於 php 擴充套件 phpredis,**還依賴於 carbon 庫,用於處理時間。**量很少,所以就不敲注釋了。

php<?php

namespace blog\redis;

use \redis;

use carbon\carbon;

class ranks

public function addscores($member, $scores)

protected function getonedayrankings($date, $start, $stop)

protected function getmultidaysrankings($dates, $outkey, $start, $stop) , $dates);

$weights = array_fill(0, count($keys), 1);

$this->redis->zunion($outkey, $keys, $weights);

return $this->redis->zrevrange($outkey, $start, $stop, true);

}public function getyesterdaytop10()

public static function getcurrentmonthdates()

return $dates;

}public function getcurrentmonthtop10()

}

redis實現排行榜

排行榜功能是乙個很普遍的需求。設想在乙個遊戲中,有上百萬的玩家資料,如果現在需要你根據玩家的經驗值整理乙個前20名的排行榜,你會怎麼做呢?你不可能 order by limit 去實現 select from game socre order by score desc limit 0,20 使用 ...

Redis 實現排行榜

不再介紹資料庫做實時排行榜的弊端,直接介紹redis的有序集合的強大作用。有序集合的資料和集合一樣,不能重複,但每個元素又可以關聯乙個分數,這個分數可以重複。需要注意的是,redis版本和命令變化較大,注意執行環境。執行環境 redis 庫版本 3.3.11 redis版本 3.2.1 生成資料 i...

Redis 有序聚合實現排行榜功能

排行榜功能是乙個很普遍的需求。使用 redis 中有序集合的特性來實現排行榜是又好又快的選擇。redis有序集合非常適用於有序不重複資料的儲存 一般排行榜都是有實效性的,比如 使用者積分榜 如果沒有實效性一直按照總榜來排,可能榜首總是幾個老使用者,對於新使用者來說,那真是太令人沮喪了。首先,來個 今...