初始化一些資料
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如果設定為2.5,則個人排名返回31再次執行
李四分數 :false
1
如果倒序,則用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通過計算查出來的,效率方面不太好。因此考慮對該功能進行公升級優化,並且新增週期性排行榜如月排行,總排行。在引入快取之後首先考慮的是通過快取實現熱門排行榜的功能,但是考慮到首次引入快取擔心快取...