基於redis的排行榜設計和實現

2021-09-02 04:08:06 字數 2085 閱讀 2559

前言:

最近想實現乙個網頁闖關遊戲的排行榜設計, 相對而言需求比較簡單. 秉承前廠長的訓導: 「做一件事之前, 先看看別人是怎麼做的」. 於是乎網上搜尋並參考了不少排行榜的實現機制, 很多人都推薦了redis的有序集(sorted set). 我覺得十分的贊, 技術方案很難在超越已有的模型了, 就看業務上的需求, 做些小改動. 

• 社交遊戲的排行榜設計和實現(2)

有序集初體驗:

先來看幾個後續會使用的redis命令語法:

zadd key score1 member1 [score2 member2]

新增乙個或多個成員到有序集合,或者如果它已經存在更新其分數

zrange key start stop [withscores]

由索引返回乙個成員範圍的有序集合。

zscore key member

獲取給定成員相關聯的分數在乙個有序集合

zrank key member

確定成員的索引中有序集合

更詳細和完整的命令, 該鏈結. 

• 案例設計

輸入5個學生的成績(name, score), 實現top-3的查詢, 修改某個同學的得分, 再次查詢top-3.

1). 新增成績記錄

新增 (lucy, 61), (lily 60), (uncle wang, 10), (lilei, 98), (hanmeimei, 99) 這5人的成績, 並假定class_rank為sorted set的name.

2). 第一次top-3查詢

3). 更新uncle wang的分數

注:zadd命令既可以新增, 也可以更新

4). 再次top-3查詢

場景的設計, 以及最後輸出的結果與預期符合.看來redis的sorted set滿足需求, 而且特別的方便.

原理**:

有了前文的直觀體驗, 再來研究redis中的有序集合(sorted set), 究竟是何種資料結構, 它能提供什麼樣的介面, 以及滿足什麼樣的需求呢?

我們來**下它支援的功能, 首先當然就是支援按分值排序的功能. 由此可以猜測它底層是按score為key, name為value的tree結構(因為支援範圍查詢, 以及按分值排序). 但是該有序集又支援按name來修改score. 這樣需求下, 又演變成name為key, score為value的map結構了. 單獨的一種資料結構, 無法滿足其需求, 兩個都不可或缺. 那答案究竟是什麼?

redis原始碼的定義如下:

typedefstructzset zset;

這樣就比較清晰了, 它採用了復合結構, 字典維護了name=>score的對映表, 而跳躍表則維護了按score排序的列表. 按name和按score的範圍查詢都天然支援.

具體的解讀,可參考<.>

總結:

其實我很早就想這篇文章,作為乙個遊戲程式設計的愛好者而言,排行榜作為乙個基礎服務,必然會接觸到.早做準備必然是好事,後續如果有機會.我想依據實際的專案,來具體闡述一下,畢竟理論和實戰, 還是有所差異.

redis排行榜之日排行周排行設計

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

redis 排行榜應用

我分享這個主要是因為 redis 的排行榜思路很讚 排行榜功能是乙個很普遍的需求。使用 redis 中有序集合的特性來實現排行榜是又好又快的選擇。一般排行榜都是有實效性的,比如 使用者積分榜 如果沒有實效性一直按照總榜來排,可能榜首總是幾個老使用者,對於新使用者來說,那真是太令人沮喪了。首先,來個 ...

redis排行榜例子

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