欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-16 09:09:33
目录前言一.实现思路二.具体实现小结前言之前在消费金融平台的时候,公司有一个专门给线下销售人员使用的app,app记录销售推广公司贷款产品赚取的佣金以及一些门店开拓和打卡的功能,后端是由我和另外一个同...

前言

之前在消费金融平台的时候,公司有一个专门给线下销售人员使用的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 排名