共計 920 個字符,預計需要花費 3 分鐘才能閱讀完成。
今天就跟大家聊聊有關如何使用 Redis 實現(xiàn)排行榜,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1、前言
實現(xiàn)一個排版榜,我們通常想到的就是 mysql 的 order by 簡單粗暴就擼出來了。但是這樣真的優(yōu)雅嗎?
數(shù)據(jù)庫是系統(tǒng)的瓶頸,這是眾所周知的。如果給你一張百萬的表,讓你排序做排行榜,花費的時間是十分可怕的。
不如緩存吧,order by 的時候強制使用索引。但是這樣真的優(yōu)雅嗎?
我們分析一下排行榜,一個用戶一個排名,意味著要去重,這時我們會想到 Java 的一種數(shù)據(jù)結構 Set。不過 Set 又是無序的。有沒有一種結構是可以保住元素唯一以及有序的呢。
幸運的是,還真的有。Redis 的 ZSet 的就是這樣的一種數(shù)據(jù)結構。Zset 里面的元素是唯一的,有序的,按分數(shù)從小到大排序。作為一名優(yōu)秀的 crud 程序員,我們從這幾個方方面入手了解 zset 結構。
2.1、ZADD 增加與修改
其時間復雜度為 O(M*log(N)),N 是有序集的基數(shù),M 為成功添加的新成員的數(shù)量。如果 key 不存在就插入,存在就更新。
使用如下:
說明:
page_rankde 是 key,10 是分數(shù),google.com 是 value。
2.2、ZRANK 查詢
時間復雜度: O(log(N))
使用如下:
說明:
salary 的 key,tom 是 value,只要輸入特定的 key 與 value 就能查詢到對應的排名。
del 刪除
直接使用 redis 的 del 命令
回到排行榜的實現(xiàn),要利用 zset 結構來實現(xiàn)的話,重要的是如何設計分數(shù)。分析一下排行榜單的設計。如果排行榜的設計按一個維度比如金幣數(shù)量,那只需把其數(shù)量取反作為分數(shù) score 即可。取反是因為 zset 默認從小到大排序。
實現(xiàn)如下:
如果排行榜的設計按兩個維度比如金幣數(shù)量和用時。由于 score 是一個可以 double 類型的參數(shù),設計的時候可以把用時作為小數(shù),用一天的總毫秒數(shù)減去花費毫秒數(shù)作為小數(shù)部分,然后當做字符串拼接起來,然后取反作為 score。
實現(xiàn)如下:
代碼實現(xiàn)
看完上述內(nèi)容,你們對如何使用 Redis 實現(xiàn)排行榜有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。