• 用Redis做数据排名


    1.背景        

            用Redis做数据缓存用的比较多,大家都能熟练使用String和Hash结构去存储数据,今天讲下如何使用ZSet来做数据排名。

            假设场景是需要按天存储全国城市的得分数据,可以查询前十名的城市排名。

            这个case可以使用传统关系型数据库做,设计一个表存储城市名、得分、录入时间,查询的时候按时间过滤某天的数据然后排序取前10条,这样做的缺点是存储的数据会越来越多,后面的查询会越来越慢。选择ZSet可以自动排序,并且key设置过期时间后,可以仅仅保存最近多少天的数据。

    2.数据结构设计

    • key:选择日期为key,比如20230924
    • member:用城市名称作为value,比如changsha
    • score:计算出来的值

    3.接口设计

    3.1 新增数据接口

    该接口负责将城市得分放到每日的key中。

    1. @GetMapping("/redis/set")
    2. public void set(@RequestParam("key") String key, @RequestParam("city") String city,@RequestParam("value") String value){
    3. Long total = redisTemplate.opsForZSet().zCard(key);
    4. if (total >= 10) {
    5. return;
    6. }
    7. redisTemplate.opsForZSet().add(key, city, Double.parseDouble(value));
    8. if (redisTemplate.hasKey(key) && 0 == total) {
    9. redisTemplate.expire(key, 7, TimeUnit.DAYS);
    10. }
    11. }
    3.2 查询城市得分排名接口
    1. @GetMapping("/redis/get")
    2. public String get(@RequestParam("key") String key){
    3. Set> typedTuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, 9);
    4. List list = new ArrayList<>();
    5. typedTuples.stream().forEach(
    6. tuple -> {
    7. CityRank cityRank = new CityRank();
    8. cityRank.setScore(tuple.getScore());
    9. cityRank.setValue(tuple.getValue().toString());
    10. list.add(cityRank);
    11. });
    12. return JSON.toJSONString(list);
    13. }

    4.测试

    使用第一个接口录入数据,得到的结果:

    使用第二个接口查询城市排名:

    [{"score":770.0,"value":"nanchang"},{"score":750.0,"value":"guangzhou"},{"score":550.0,"value":"xiamen"},{"score":500.0,"value":"nanjing"}]

    5.总结

            在使用ZSet的时候设置Key过期时间想了好久,如果在Key没有创建的时候对其设置过期时间是无效的,因此在添加完数据后做了一个判断,必须有Key,并且里面只有一个元素这是就设置过期时间,后面增加数据不会再走此逻辑,防止延长过期时间导致Key一直存在。希望朋友们看了我的文章针对数据排名展示这块有更好的想法和我交流。

  • 相关阅读:
    mysql配置所有人可连接_mysql配置允许外界连接
    使用HTML5画布(Canvas)模拟图层(Layers)效果
    基于openEuler虚拟机远端执行mugen测试脚本
    CORE EMU初接触
    sstream及按格式字符分割字符串
    【算法练习】27:冒泡排序学习笔记
    python 编写登录界面
    Asp.NetCore 从数据库加载配置(二)
    opengl-shader学习笔记:varying变量
    2023-9-28 JZ26 树的子结构
  • 原文地址:https://blog.csdn.net/dotnetstudio/article/details/133253306