redis使用zset实现排行榜功能(取前5位/倒数5位)

package com.lezu.springboot.test.redis;

import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.LinkedHashMap;
import java.util.Set;

/**
 * redis排行榜功能实现(取前5位/倒数5位)
 *
 * @author LianJiaYu
 * @date 2022/6/22 16:02
 */
@SpringBootTest
public class RankingList {
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Test
    public void test1() {
        //fastjson是由hashMap组成的,所以内容存放的顺序并不是有序的
        JSONObject data = new JSONObject(new LinkedHashMap<>());
        //积分排行榜
        String rankingList = "ranking_list:integral";
//        //战斗力排行榜
//        String combat = "ranking_list:combat";
        //随机生成10个4位数
        for (int i = 0; i < 10; i++) {
            String score = RandomUtil.randomNumbers(4);
            redisTemplate.opsForZSet().add(rankingList, "user_id" + i, Integer.parseInt(score));
        }
        //获取前5名的value
        Set<String> reverseRange = redisTemplate.opsForZSet().reverseRange(rankingList, 0, 4);
        //获取倒数5名的value
//      Set<String> range = redisTemplate.opsForZSet().range(rankingList, 0, 4);
        reverseRange.forEach(v -> {
            //根据rankingList+value获取score
            Double score = redisTemplate.opsForZSet().score(rankingList, v);
            //value和score放入JSON中
            data.put(v, score);
        });
        System.out.println(data);
    }
}

随机生成4位数插入10条数据 

 

 运行结果

 StringRedisTemplate手册参考

springboot2.X手册:redis的7种类型100个方法全解析 - 知乎

posted @ 2022-06-22 16:06  难忘是想起  阅读(0)  评论(0)    收藏  举报  来源