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

 

初始化一些數據

        Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<>();
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100; i++) {
			DefaultTypedTuple<String> tuple = new DefaultTypedTuple<>("張三" + i, 1D + i);
			tuples.add(tuple);
		}
		System.out.println("循環時間:" +( System.currentTimeMillis() - start));
		Long num = redisTemplate.opsForZSet().add(SCORE_RANK, tuples);
		System.out.println("批量新增時間:" +(System.currentTimeMillis() - start));
		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
		Set<ZSetOperations.TypedTuple> s = redisTemplate.opsForZSet().rangeByScoreWithScores(SCORE_RANK, 0, 200);
		System.out.println(JSON.toJSONString(s));

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

下面是結果

統計的人數:100
集合的基數爲:100
["張三0","張三1","張三2","張三3",…………,"張三98","張三99"]
[{"score":1.0,"value":"張三0"},{"score":2.0,"value":"張三1"},{"score":3.0,"value":"張三2"},{"score":4.0,"value":"張三3"},

…………  ,{"score":99.0,"value":"張三98"},{"score":100.0,"value":"張三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,後續就查庫就可以了,不過一般作爲排行榜的服務不關心這個,業務方自己找

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章