1 前言
實現乙個排版榜,我們通常想到的就是mysql的order by 簡單粗暴就擼出來了。但是這樣真的優雅嗎?
資料庫是系統的瓶頸,這是眾所周知的。如果給你一張百萬的表,讓你排序做排行榜,花費的時間是十分可怕的。
不如快取吧,order by的時候強制使用索引。但是這樣真的優雅嗎?
2 redis的排行榜
我們分析一下排行榜,乙個使用者乙個排名,意味著要去重,這時我們會想到j**a的一種資料結構set。不過set又是無序的。有沒有一程式設計客棧程式設計客棧種結構是可以保住元素唯一以及有序的呢。
幸運的是,還真的有。redis的zset的就是這樣的一種資料結構。zset裡面的元素是唯一的,有序的,按分數從小到大排序。作為一名優秀的crud程式設計師,我們從這幾個方方面入手了解zset結構。
2.1 zadd 增加與修改
其時間複雜度為 o(m*log(n)), n 是有序集的基數, m 為成功新增的新成員的數量。如果key不存在就插入,存在就更新。
使用如下:
redis> zadd page_rank 10 google.com
(integer) 1
說明:page_rankde 是key,10是分數,google.com是value
2.2 zrank 查詢
時間複雜度: o(log(n))
使用如下:
redis> zrange salary 0 -1 # 顯示所有成員
1) "peter"
2) "tom"
3) "程式設計客棧jack"
redis> zrank salary tom # 顯示 tom 的薪水排名,第二
(integer) 1
說明:salary的key,tom是value,只要輸入特定的key與value就能查詢到對應的排名。
2. del 刪除
直接使用redis的del命令
3 分數設計
回到排行榜的實現,要利用zset結構來實現的話,重要的是如何設計分數。分析一下排行榜單的設計。如果排行榜的設計按乙個維度比如金幣數量,那只需把其數量取反作為分數score即可。取反是因為zset預設從小到大排序。
實現如下:
public double getscore( long onedaygoldbean)
如果排行榜的設計按兩個維度比如金幣數量和用時。由於score是乙個可以double型別的引數,設計的時候可以把用時作為小數,用一天的總毫秒數減去花費毫秒數作為小數部分,然後當做字串拼接起來,然後取反作為score.
實現如下:
public double getscore( long onedaygoldbean, long usetime)
private long gettodayendss(long current)
4 **實現
@override
public boolean insertleaderboard()
@override
public set checkleaderboard()
原始碼總結
本文標題: redis實現排行榜的簡單方法
本文位址: /shujuku/redis/267838.html
redis實現排行榜
排行榜功能是乙個很普遍的需求。設想在乙個遊戲中,有上百萬的玩家資料,如果現在需要你根據玩家的經驗值整理乙個前20名的排行榜,你會怎麼做呢?你不可能 order by limit 去實現 select from game socre order by score desc limit 0,20 使用 ...
Redis 實現排行榜
不再介紹資料庫做實時排行榜的弊端,直接介紹redis的有序集合的強大作用。有序集合的資料和集合一樣,不能重複,但每個元素又可以關聯乙個分數,這個分數可以重複。需要注意的是,redis版本和命令變化較大,注意執行環境。執行環境 redis 庫版本 3.3.11 redis版本 3.2.1 生成資料 i...
Redis排行榜的實現
遊戲闖關排行榜以通關次數正序 復活次數倒序和第一次通關的時間倒序來進行排序 第一步是組合排序分值,只有根據排序規則組合出來的分值,才能通過排序獲取到正確的排名。在排序規則中一般會有兩種方式,屬性正序和倒序。正序對於組合數字來說沒有影響,但是倒序就需要進行特殊的處理。那麼多說無益,上 排行榜顧名思義就...