redis 排行榜應用

2021-07-28 12:10:39 字數 2068 閱讀 4920

我分享這個主要是因為 redis 的排行榜思路很讚

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

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

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

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

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

redis 命令如下:

import redis

redis_rank_pool =

# redis 預設有16個庫,編號為:0~15,這裡使用的db 是1 號庫,若不指定,使用預設0號庫

p = redis.redis(connection_pool=redis_rank_pool)

c = p.pipeline()

c.zincrby('rank:20150401', 1, 5)

c.execute()

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

c.zincrby('rank:20150401', 2, 1)

c.zincrby('rank:20150401', 3, 10)

c.execute()

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

c.zrevrange('rank:20150401', 0, -1, withscores=true)

c.execute()

[[('3', 10),

('1', 5),

('2', 1)]]

# 這裡有這種結構是因為我用了管道,

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

c.zrevrange('rank:20150401', 0, 9, withscores=true)

c.execute()

[[('3', 10),

('1', 5),

('2', 1)]]

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

下面的內容我沒有測試,有時間再試試吧,但是思路很好

利用並集實現多天的積分總和,實現「上週積分榜」:

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

「月度榜」、「季度榜」、「年度榜」等等就以此類推。

最近在使用redis,有另一種配置以及使用如下:

import redis

r = redis.redis()

_conn = r.from_url('redis://localhost:6379/2')

pipe = cls._conn.pipeline()

pipe.get("1:2:3")

tt = pipe.execute()

tt = tt[0]

print(tt)

乙個redis配置資訊是字典(key,value)的,乙個是字串形式的,實現上略微有些不同

redis排行榜例子

1 儲存幾個排行榜成員資料 這裡可以理解為把自己系統已有資料載入到 redis 中 zadd testtop 23 member1 25 member2 2 增加某個人的分數 這裡的分數就是排行的依據可以是浮點型別 zincrby testtop 20 member1 此時 testtop 中 me...

redis排行榜相關

排行榜是業務開發中常見的乙個場景,如何設計乙個好的資料結構能夠滿足高效實時的查詢,下面我們結合乙個實際例子來討論一下。選手報名參加活動,觀眾可以對選手進行投票,每個觀眾對同一名選手只能投一票,活動期間最多投四票。後台需要提供如下介面 首先需要一張表儲存投票記錄,一次投票就是一條記錄。這張表相當於投票...

redis實現排行榜

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