redis排重 使用Redis實現實時排名

2021-10-16 14:25:11 字數 2453 閱讀 5572

redis用途很廣泛,分布式使用者session快取、爬蟲url佇列、活動頁面的動態列表資訊等。使用redis實現排行榜系統也是很常見的方案。

假如設計乙個積分排名系統。如果積分資料都存放在資料庫中,積分的更新是動態的,每次訪問排行頁面都需要對資料進行重新排序,在真實的產品應用中幾乎是不可接受的。

redis 提供了 sorted set 有序集合資料結構,高效的插入和刪除效能,適用於需實時排序的場景。我們先拋開sorted set 的實現機制,先來嘗試一下利用redis實現乙個實時的排行榜系統。

zadd——新增玩家

zadd 排行榜名稱 分數 玩家標識

zadd命令如果重複新增 排行榜名稱和玩家標識相同,記錄會被覆蓋

所以我們使用zincrby實現新增使用者的功能

zincrby——增減玩家分數

zincrby 排行榜名稱 分數 使用者

127.0.0.1:6379> zincrby rank:20180601 5 user1

"10"

127.0.0.1:6379> zincrby rank:20180601 1 user2

"1"127.0.0.1:6379> zincrby rank:20180601 10 user3

"10"

127.0.0.1:6379> zincrby rank:20180602 15 user1

"15"

127.0.0.1:6379> zincrby rank:20180602 10 user3

"10"

127.0.0.1:6379> zincrby rank:20180603 21 user2

"21"

127.0.0.1:6379> zincrby rank:20180603 5 user2

"26"

zincrby rank:20180603 5 user2(使用者user2在20180603新增5分)

zscore——檢視玩家分數

zscore 排行榜名稱 玩家標識

127.0.0.1:6379> zscore rank:20180603 user2

"26"

檢視user2這個玩家在20180603積累的分數。

zrevrange——檢視排行榜

zrevrange 排行榜名稱 起始位置 結束位置 [withscores]

由於排行榜一般是按照分數由高到低排序的,所以我們使用zrevrange,而命令zrange是按照分數由低到高排序。

起始位置和結束位置都是以0開始的索引,且都包含在內。如果結束位置為-1則檢視範圍為整個排行榜。

帶上withscores則會返回玩家分數。

127.0.0.1:6379> zrevrange rank:20180601 0 -1 withscores

1) "user3"

2) "10"

3) "user1"

4) "10"

5) "user2"

6) "1"

檢視20180601這一天所有玩家分數。

zrevrange——檢視指定時間範圍排行榜

zunionstore destination numkeys key [key ...]

127.0.0.1:6379> zunionstore rank:last_three_days 3 rank:20180601 rank:20180602 rank:20180603 weights 1 1 1

(integer) 3

這樣就將最近3天的積分記錄合併到有序集合 rank:last_three_days 中了。

權重因子 weights 如果不給,預設就是 1。為了不隱藏細節,特意寫出。

那麼查詢最近3天的積分榜 top10 的資訊就是:

127.0.0.1:6379> zrevrange rank:last_three_days 0 9 withscores

1) "user2"

2) "27"

3) "user1"

4) "25"

5) "user3"

6) "20"

zrevrank——檢視玩家的排名

zrevrank 排行榜名稱 玩家標識

127.0.0.1:6379> zrevrank rank:20180601 user2

(integer) 2

查詢使用者user2在20180601這一天的排名

zrem——移除某個玩家

zrem 排行榜名稱 玩家標識

del——刪除排行榜

del 排行榜名稱

總結上面展示了利用redis實現實時的排行榜的排行系統。當然,要完成真正的排行榜系統還有很多細節的地方要處理,如相同分數的如何根據其他條件排序等。

同樣,也可以實現對於論壇帖子的瀏覽統計和排序,熱度的排名(可以使用zunionstore 的 weights 分配不同的權重 實現)。

其他命令

上面只是列出了一部分命令的使用,下面給出命令列表,可以自行組合嘗試

redis排重 使用 Redis 實現排行榜功能

排行榜功能是乙個很普遍的需求。使用 redis 中有序集合的特性來實現排行榜是又好又快的選擇。一般排行榜都是有實效性的,比如 使用者積分榜 如果沒有實效性一直按照總榜來排,可能榜首總是幾個老使用者,對於新使用者來說,那真是太令人沮喪了。首先,來個 今日積分榜 吧,排序規則是今日使用者新增積分從多到少...

redis排重 使用redis進行排行榜的小秘訣

前言 在日常一些簡單的活動開發中,我經常會碰到需要對使用者的分值等進行排行,此時一般會選擇redis的有序集合對使用者的分數進行儲存,但是不同的場景排行榜的方式也略有不同,以下根據自己日常的開發進行了一下歸納總結 redis 有序集合 sorted set 首先簡單介紹下什麼是有序集合。redis ...

redis排重 使用 Redis 實現排行榜功能

排行榜功能是乙個很普遍的需求。使用 redis 中有序集合的特性來實現排行榜是又好又快的選擇。一般排行榜都是有實效性的,比如 使用者積分榜 如果沒有實效性一直按照總榜來排,可能榜首總是幾個老使用者,對於新使用者來說,那真是太令人沮喪了。首先,來個 今日積分榜 吧,排序規則是今日使用者新增積分從多到少...