Redis实现排名功能的示例代码

 更新时间:2022年02月16日 11:24:39   作者:做人要潇洒一点  
本文主要介绍了Redis实现排名功能的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

之前在消费金融平台的时候,公司有一个专门给线下销售人员使用的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是一个高性能的键值存储系统,专于处理计数器和事务操作,它提供了INCR、DECR等命令来进行原子递增或递减操作,并通过MULTI、EXEC等命令实现事务操作,此外,Redis的Pipeline功能可减少网络往返次数,提高性能
    2024-10-10
  • SpringBoot整合Redis实现序列化存储Java对象的操作方法

    SpringBoot整合Redis实现序列化存储Java对象的操作方法

    这篇文章主要介绍了SpringBoot整合Redis实现序列化存储Java对象,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Redis主从配置和底层实现原理解析(实战记录)

    Redis主从配置和底层实现原理解析(实战记录)

    今天给大家分享Redis主从配置和底层实现原理解析,本文通过实战项目给大家源码解析,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-06-06
  • 单线程Redis快的4 个原因总结

    单线程Redis快的4 个原因总结

    作为内存中数据存储,Redis 以其速度和性能着称,通常被用作大多数后端服务的缓存解决方案,但是,在内部,Redis 采用单线程架构,为什么单线程设计依然会有这么高的性能,在本文中,让我们深入探讨为什么 Redis 才有单线程架构
    2023-07-07
  • 使用Redis实现分布式锁的方法

    使用Redis实现分布式锁的方法

    为了保证我们线上服务的并发性和安全性,目前我们的服务一般抛弃了单体应用,采用的都是扩展性很强的分布式架构,这篇文章主要介绍了使用Redis实现分布式锁的方法,需要的朋友可以参考下
    2022-06-06
  • IDEA初次连接Redis配置的实现

    IDEA初次连接Redis配置的实现

    本文主要介绍了IDEA初次连接Redis配置的实现,文中通过图文步骤介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • redis 过期策略及内存回收机制解析

    redis 过期策略及内存回收机制解析

    这篇文章主要介绍了redis 过期策略及内存回收机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Redis教程(二):String数据类型

    Redis教程(二):String数据类型

    这篇文章主要介绍了Redis教程(二):String数据类型,本文讲解了String数据类型概述、相关命令列表、命令使用示例三部分内容,需要的朋友可以参考下
    2015-04-04
  • Redis高可用的三种实现方式

    Redis高可用的三种实现方式

    在实际生产环境中为保证Redis的服务连续性和可靠性,需要设计一个高可用架构,本文就来介绍一下Redis高可用的三种实现方式,主要包括主从复制模式,Redis Sentinel模式和Redis Cluster模式,感兴趣的可以了解一下
    2023-12-12
  • Redis 基础教程之事务的使用方法

    Redis 基础教程之事务的使用方法

    这篇文章主要介绍了Redis 基础教程之事务的使用方法的相关资料,Redis 事务可以一次执行多个命令和保证,单独的隔离操作和原子操作需要的朋友可以参考下
    2017-08-08

最新评论