redis排行榜實現以及注意事項與問題

2021-10-06 01:18:02 字數 2011 閱讀 4219

初始化一些資料

set> tuples = new hashset<>();

long start = system.currenttimemillis();

for (int i = 0; i < 100; i++)

long num = redistemplate.opsforzset().add(score_rank, tuples);

system.out.println("受影響行數:" + num);

查詢下資料,排行榜

long count = redistemplate.opsforzset().count(score_rank, 0, 300);

system.out.println("統計0-300之間的人數:" + count);

long along = redistemplate.opsforzset().zcard(score_rank);

system.out.println("集合的基數為:" + along);

//根據分數正序排名返回 只有value

set set = redistemplate.opsforzset().rangebyscore(score_rank, 0, 200);

system.out.println(json.tojsonstring(set));

//返回value何score

sets = redistemplate.opsforzset().rangebyscorewithscores(score_rank, 0, 200);

system.out.println(json.tojsonstring(s));

對於倒序一般在查詢的前面加個reverse就可以了

下面是結果

統計的人數:100

集合的基數為:100

["張三0","張三1","張三2","張三3",…………,"張三98","張三99"]

[,,,,

…………  ,,]

//新增/更新 變動則更新成功,否則失敗

boolean score = redistemplate.opsforzset().add(score_rank, "王五", 1);

system.out.println("李四分數 :" + score);

//獲取個人排名

long d = redistemplate.opsforzset().rank(score_rank, "王五");

system.out.println(d);

李四分數 :true

1再次執行

李四分數 :false

1

如果設定為2.5,則個人排名返回3

如果倒序,則用reverserank,個人排名返回98

double score = redistemplate.opsforzset().incrementscore(score_rank, "李四", 1);

system.out.println("李四分數+1後:" + score);

執行了兩次 

李四分數+1後:2.0

如果是重構時,db和redis的資料怎麼同步才能避免資料不一致?

業務上一般我們都會先查詢這個使用者,然後判斷是否滿足加或者減;這個分數已經是算好的,可以使用redis的add操作新增/更新當前資料,建議不用incre,避免多了或是少了都不知道,而add可以保證冪等

然後把所有資料查出來add到redis,如果程式已經執行了就會返回false

然後可以使用查詢排行榜介面了

這裡有乙個問題,我們一般會用username或者userid作為value,取分數 add到redis中,查詢排行榜的時候如果是userid-score,我要知道對應的username,後續就查庫就可以了,不過一般作為排行榜的服務不關心這個,業務方自己找

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實現

最近專案架構公升級,主要對效能方面進行公升級。之前熱門排行榜是通過對點讚量,閱讀量,收藏量等一系列的資料在db通過計算查出來的,效率方面不太好。因此考慮對該功能進行公升級優化,並且新增週期性排行榜如月排行,總排行。在引入快取之後首先考慮的是通過快取實現熱門排行榜的功能,但是考慮到首次引入快取擔心快取...