Redis实现排名功能

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 之前在消费金融平台的时候,公司有一个专门给线下销售人员使用的APP,APP记录销售推广公司贷款产品赚取的佣金以及一些门店开拓和打卡的功能,后端是由我和另外一个同事开发的,其中有一个模块是全国门店内的销售佣金实时排名,说到排名很多人的第一反应都是这是个Top N的问题,从数据库取出来用MySQL的top函数不就可以实现了,事实上当时无法从表里取到数据,数据还要配合权限,有全国和大区的排名,还需要计算大区经理下所有人员的有效佣金,还要求是实时的,从数据库读取再计算肯定不行,跳到排名页至少等待5s左右数据才能出来,那怎么办呢,可以放Redis里,那么接下来我们一起看看如何用Redis实现这个排名功能

微信截图_20220531145056.png

前言


之前在消费金融平台的时候,公司有一个专门给线下销售人员使用的APP,APP记录销售推广公司贷款产品赚取的佣金以及一些门店开拓和打卡的功能,后端是由我和另外一个同事开发的,其中有一个模块是全国门店内的销售佣金实时排名,说到排名很多人的第一反应都是这是个Top N的问题,从数据库取出来用MySQL的top函数不就可以实现了,事实上当时无法从表里取到数据,数据还要配合权限,有全国和大区的排名,还需要计算大区经理下所有人员的有效佣金,还要求是实时的,从数据库读取再计算肯定不行,跳到排名页至少等待5s左右数据才能出来,那怎么办呢,可以放Redis里,那么接下来我们一起看看如何用Redis实现这个排名功能。


一.实现思路


使用的是Redis里zset数据类型,zset的定义这里总结一下就是其每个元素都能够关联一个分数而且还能够针对集合元素进行排序,所以这点很合适用来排序,接下来我们一起看看如何用其实现排名功能。


二.具体实现


1.添加数据的方法包装

public  void zAdd(String key,Object member,double score){
    try {
          redisTemplate.opsForZSet().add(key,member,score);
    } catch (Exception e) {
        log.error("redis zAdd has a error,key:{},value:{},score:{},exception:{}",key,member,score,e);
    }
}
复制代码


2.获取数据的方法包装

public  Set<Object> zRange(String key,int start,int end){
    try {
    //按照位置倒序取值和分数
        Set<ZSetOperations.TypedTuple<Object>> typedTuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);
        if(typedTuples==null||typedTuples.size()==0) return null;
        return Collections.singleton(typedTuples);
    } catch (Exception e) {
        log.error("redis zRange has a error,key:{},start:{},end:{},exception:{}",
                key,start,end,e);
        return null;
    }
}
复制代码


3.测试方法,乱序添加,如果想佣金从少到多在佣金前添加负号即可

redisUtils.zAdd("rank","王五",new Double("2000.00"));
redisUtils.zAdd("rank","张三",new Double("1000.00"));
redisUtils.zAdd("rank","王可",new Double("4000.00"));
redisUtils.zAdd("rank","向巧巧",new Double("6000.00"));
redisUtils.zAdd("rank","沙振华",new Double("7000.00"));
redisUtils.zAdd("rank","钱多多",new Double("5000.00"));
redisUtils.zAdd("rank","黄三",new Double("3000.00"));
redisUtils.zAdd("rank","高邱",new Double("8000.00"));
redisUtils.zAdd("rank","许晴",new Double("9000.00"));
redisUtils.zAdd("rank","包虎",new Double("10000.00"));
//获取添加进redis的数据,使用上面2方法
Set<Object> rank = redisUtils.zRange("rank", 0, 9);
//todo 拿到数据进行其他逻辑处理
//打印结果
rank.forEach(System.out::println);
复制代码


4.执行结果

[DefaultTypedTuple [score=10000.0, value=包虎],
DefaultTypedTuple [score=9000.0, value=许晴], 
DefaultTypedTuple [score=8000.0, value=高邱],
DefaultTypedTuple [score=7000.0, value=沙振华],
DefaultTypedTuple [score=6000.0, value=向巧巧],
DefaultTypedTuple [score=5000.0, value=钱多多],
DefaultTypedTuple [score=4000.0, value=王可], 
DefaultTypedTuple [score=3000.0, value=黄三], 
DefaultTypedTuple [score=2000.0, value=王五],
DefaultTypedTuple [score=1000.0, value=张三]]
复制代码


小结


zset里除了计算排名的方法还有计算集合条件内个数的zcount方法,查看集合总个数zcard方法等等,用起来还是很方便的,但是还是那句话具体的只能到具体的业务里才知道实用不,而且还要注意Redis有数据淘汰策略,这个点也千万不要忽视了,还有就是针对已经废弃的业务数据还在缓存在Redis的里也要记得检查和清除掉。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(四)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(二)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(一)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
存储 NoSQL Java
Java 最常见的面试题:redis 有哪些功能?
Java 最常见的面试题:redis 有哪些功能?
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(三)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
24天前
|
存储 NoSQL 数据处理
Redis Lua脚本:赋予Redis更强大的逻辑与功能
Redis Lua脚本:赋予Redis更强大的逻辑与功能
|
29天前
|
缓存 NoSQL Shell
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
159 0
|
29天前
|
存储 缓存 NoSQL
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)(一)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)
352 0
|
1月前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
46 1
|
4月前
|
NoSQL 关系型数据库 MySQL
使用redis实现关注粉丝功能(php版) 2020-07-12染念 染
redis不用说啥了,比mysql有的是可以吹的地方,于是很多人选择用redis来实现这类操作频繁的场景 @(汗) 但是下午第一次安装redis花了好多时间... 这里借用[button href="https://www.jianshu.com/p/e3f0b98a78bc"]Redis实现用户关注功能[/button]的思路
24 0

热门文章

最新文章