青浦网站设计制作,简述制作网页时需要的环节,网站建设 东方网景,建设一个企业网站需要多少钱1.背景 用Redis做数据缓存用的比较多#xff0c;大家都能熟练使用String和Hash结构去存储数据#xff0c;今天讲下如何使用ZSet来做数据排名。 假设场景是需要按天存储全国城市的得分数据#xff0c;可以查询前十名的城市排名。 这个case可以使用传统关系型数据库做…1.背景 用Redis做数据缓存用的比较多大家都能熟练使用String和Hash结构去存储数据今天讲下如何使用ZSet来做数据排名。 假设场景是需要按天存储全国城市的得分数据可以查询前十名的城市排名。 这个case可以使用传统关系型数据库做设计一个表存储城市名、得分、录入时间查询的时候按时间过滤某天的数据然后排序取前10条这样做的缺点是存储的数据会越来越多后面的查询会越来越慢。选择ZSet可以自动排序并且key设置过期时间后可以仅仅保存最近多少天的数据。
2.数据结构设计
key选择日期为key比如20230924member用城市名称作为value比如changshascore计算出来的值
3.接口设计
3.1 新增数据接口
该接口负责将城市得分放到每日的key中。
GetMapping(/redis/set)public void set(RequestParam(key) String key, RequestParam(city) String city,RequestParam(value) String value){Long total redisTemplate.opsForZSet().zCard(key);if (total 10) {return;}redisTemplate.opsForZSet().add(key, city, Double.parseDouble(value));if (redisTemplate.hasKey(key) 0 total) {redisTemplate.expire(key, 7, TimeUnit.DAYS);}}
3.2 查询城市得分排名接口
GetMapping(/redis/get)public String get(RequestParam(key) String key){SetZSetOperations.TypedTupleObject typedTuples redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, 9);ListCityRank list new ArrayList();typedTuples.stream().forEach(tuple - {CityRank cityRank new CityRank();cityRank.setScore(tuple.getScore());cityRank.setValue(tuple.getValue().toString());list.add(cityRank);});return JSON.toJSONString(list);}
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一直存在。希望朋友们看了我的文章针对数据排名展示这块有更好的想法和我交流。