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 排名内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Redis数据库的安装配置方法

    redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Python,Ruby,Erlang,PHP客户端,使用很方便.问题是这个项目还很新,可能还不足够稳定,而且没有在实际的一些大型系统应用的实例.此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的. 性能测试结果: SET操作每秒钟 110000 次,GET操作每秒钟 81

  • Redis主从复制问题和扩容问题的解决思路

    一.解决主从复制问题 当使用Redis作为存储引擎的时候,并且使用Redis读写分离,从机作为读的情况,从机宕机或者和主机断开连接都需要重新连接主机,重新连接主机都会触发全量的主从复制,这时候主机会生成内存快照,主机依然可以对外提供服务,但是作为读的从机,就无法提供对外服务了,如果数据量大,恢复的时间会相当的长.为了解决Redis主从Copy的问题,有如下两个解决方案: 主动复制所谓主动复制,就是业务层双写多个Redis,避开Redis自带的主从复制.但是自己干同步,就会产生一致性问题,为了保证

  • redis中使用java脚本实现分布式锁

    redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题.例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性,这如果在同一个vm下面,就很容易加锁,但如果在分布式环境下就没那么容易了,当然利用redis现有的功能也有解决办法,比如redis的脚本. redis在2.6以后的版本中增加了Lua脚本的功能,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用

  • Redis中统计各种数据大小的方法

    如果 MySQL 数据库比较大的话,我们很容易就能查出是哪些表占用的空间:不过如果 Redis 内存比较大的话,我们就不太容易查出是哪些(种)键占用的空间了. 有一些工具能够提供必要的帮助,比如 redis-rdb-tools 可以直接分析 RDB 文件来生成报告,可惜它不能百分百实现我的需求,而我也不想在它的基础上二次开发.实际上开发一个专用工具非常简单,利用 SCAN和 DEBUG等命令,没多少行代码就能实现: 复制代码 代码如下: <?php $patterns = array(    

  • Redis的使用模式之计数器模式实例

    Redis 是目前 NoSQL 领域的当红炸子鸡,它象一把瑞士军刀,小巧.锋利.实用,特别适合解决一些使用传统关系数据库难以解决的问题.打算写一系列 Redis 使用模式的文章,深入总结介绍 Redis 常见的使用模式,以供大家参考. 常见汇总计数器 汇总计数是系统常见功能,比如网站通常需要统计注册用户数,网站总浏览次数等等. 使用 Redis 提供的基本数据类型就能实现汇总计数器,通过 incr 命令实现增加操作. 比如注册用户数,基本操作命令如下: 复制代码 代码如下: # 获取注册用户数

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

    目录 前言 一.实现思路 二.具体实现 小结 前言 之前在消费金融平台的时候,公司有一个专门给线下销售人员使用的APP,APP记录销售推广公司贷款产品赚取的佣金以及一些门店开拓和打卡的功能,后端是由我和另外一个同事开发的,其中有一个模块是全国门店内的销售佣金实时排名,说到排名很多人的第一反应都是这是个Top N的问题,从数据库取出来用MySQL的top函数不就可以实现了,事实上当时无法从表里取到数据,数据还要配合权限,有全国和大区的排名,还需要计算大区经理下所有人员的有效佣金,还要求是实时的,从

  • 利用Redis实现点赞功能的示例代码

    目录 MySQL 和 Redis优缺点 1.Redis 缓存设计及实现 部分代码如下 Redis 存储结构如图 2.数据库设计 3.开启定时任务持久化存储到数据库 部分代码如下 提到点赞,大家一想到的是不是就是朋友圈的点赞呀?其实点赞对我们来说并不陌生,我们经常会在手机软件或者网页中看到它,今天就让我们来了解一下它的实现吧.我们常见的设计思路大概分为两种:一种自然是用 MySQL 等数据库直接落地存储, 另外一种就是将点赞的数据保存到 Redis 等缓存里,在一定时间后刷回 MySQL 等数据库

  • Redis实现订单自动过期功能的示例代码

    前言 用户下单后,规定XX分钟后自动设置为"已过期",不能再发起支付.项目类似此类"过期"的需求,笔者提供一种使用Redis的解决思路,结合Redis的订阅.发布和键空间通知机制(Keyspace Notifications)进行实现. 配置redis.confg notify-keyspace-events选项默认是不启用,改为notify-keyspace-events "Ex".重启生效,索引位i的库,每当有过期的元素被删除时,向**key

  • SpringBoot整合Redis实现访问量统计的示例代码

    目录 前言 Spring Boot 整合 Redis 引入依赖.增加配置 翠花!上代码 前言 之前开发系统的时候客户提到了一个需求:需要统计某些页面的访问量,记得当时还纠结了一阵子,不知道怎么去实现这个功能,后来还是在大佬的带领下借助 Redis 实现了这个功能.今天又回想起了这件事,正好和大家分享一下 Spring Boot 整合 Redis 实现访问量统计的全过程. 首先先解释一下为什么需要借助 Redis,其实原因也很简单,就是因为它非常快(每秒可执行大约110000次的 SET 操作,每

  • Redis实现登录注册的示例代码

    目录 1. 引言 2. 流程图及代码实现 2.1 生成验证码保存到Redis 2.2 登录验证 2.3 请求拦截器 3. 总结 1. 引言 在传统的项目中,用户登录成功,将用户信息保存在session中,这种方式在微服务架构中会产生一系列问题.例如在购物车服务具有多台服务器,当一个请求落在购物车1号服务器后,其session保存了用户信息,另一个请求落在了购物车2号服务器,发现没有用户信息,则重新需要进行登录.服务器之间有session不共享的问题.为了解决这一问题,tomcat提出了内存拷贝,

  • VUE饿了么树形控件添加增删改功能的示例代码

    本文介绍了VUE饿了么树形控件添加增删改功能的示例代码,分享给大家,具体如下: element-ui树形控件:地址 在原文档中有个案例是有新增和删除功能,但是后来发现其修改的数据并不能直接影响到树形数据,所以采用了 render-content 的API重新写了个组件. 写个开发的步骤,所以文章比较长emmm 大致效果如图: 1.省市API 在网上复制了个省市的list,有两个属性是新增的 isEdit :控制编辑状态 maxexpandId :为现下id的最大值 export default{

  • Java利用Redis实现消息队列的示例代码

    本文介绍了Java利用Redis实现消息队列的示例代码,分享给大家,具体如下: 应用场景 为什么要用redis? 二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成java对象; 主要是用到了ByteArrayOutputStream和ByteArrayInputStream; 注意:每个需要序列化的对象都要实现Serializable接口; 其代码如下: package Utils

  • Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用onTouchListener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; //语音文件保存路径 private String FileName = null; FileName = Environment.getExternalStorageDirectory().getAbs

  • php 实现收藏功能的示例代码

    整理文档,搜刮出一个php 实现收藏功能的示例代码,稍微整理精简一下做下分享. HTML: <a class = "x" id="{$photo.id}" uid="{$Think.session.uid}" status = "{$collect_pic}" href = "javascript:void(0);"> <if condition = "$collect_num

  • Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数示例代码

    最终效果如下 大概就几个步骤 1.安装 Docker CE 2.运行 Redis 镜像 3.Java 环境准备 4.项目准备 5.编写 Dockerfile 6.发布项目 7.测试服务 环境准备 系统:Ubuntu 17.04 x64 Docker 17.12.0-ce IP:45.32.31.101 一.安装 Docker CE 国内不建议使用:"脚本进行安装",会下载安装很慢,使用步骤 1 安装,看下面的链接:常规安装方式 1.常规安装方式 Ubuntu 17.04 x64 安装

随机推荐