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