写在前面

排行榜在很多地方都能使用到,redis的zset可以很方便地用来实现排行榜功能。本文是一个示例。

聊聊 zset

ZSet 是有序集合,redis的有序集合与集合一样也是String类型元素的集合,不允许有重复的元素。 每一个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合中的成员是唯一的,但是分数可以重复。

集合是通过哈希表实现的,集合中的最大元素是2的32次方减1。Zset是有序且不重复的。
注意:默认排序从小到大。对于一般分数从高到低排列的话,可考虑加上负号,比如 100 变成 -100.

添加一个
zadd money_rank100 zyf为 zyf 这个元素的得分 加上 3
zincrby money_rank 3 zyf去处前三名
zrange money_rank 0 3列出全部,并显示分数(从低到高)
zrange money_rank 0 -1 withscores列出全部,并显示分数(从高到低)
zrevrange WARNING_COUNT_RANK 0 -1 withscores查看有多少人
zcard money_rank查看 zyf 的排名次序
zrank money_rank zyf查看 zyf 的排名次序 (倒序)
zrevrank rank c++移除
zrem money_rank zyf

用 java 代码实现示例

由于 redis 的zset 默认的事从低到高排序,这里使用的反转的排序
用了这些方法:

  • 得分/数量变化:stringRedisTemplate.opsForZSet().add(...)
  • 获得排行榜:stringRedisTemplate.opsForZSet().reverseRangeWithScores(...)
  • 查询某个设备的得分:stringRedisTemplate.opsForZSet().reverseRank(...)

触发 得分变化

// 触发 一个设备的报警@PostMapping("/warning/{deviceId}/{num}")String warning(@PathVariable String deviceId, @PathVariable int num) {// zadd 方法:不存在则添加,存在则更新//Boolean add = stringRedisTemplate.opsForZSet().add(WARNING_COUNT_RANK, deviceId, num);// zincr 方法:不存在则从0+delta,存在则累加Double aDouble = stringRedisTemplate.opsForZSet().incrementScore(WARNING_COUNT_RANK, deviceId, num);return aDouble + "";}

获得总排行榜

/*** 获得总排行榜** @param topN 前多少名* @return*/@GetMapping("/top")List<DeviceRank> getTotalRank(@RequestParam(defaultValue = "10", required = false) Integer topN) {List<DeviceRank> lst = new ArrayList<>();Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeWithScores(WARNING_COUNT_RANK, 0, topN - 1);typedTuples.forEach(p -> {String value = p.getValue();Double score = p.getScore();lst.add(new DeviceRank(value, score));});return lst;}

获得某个设备的名次

/*** 获得某个设备的名次** @param deviceId 设备id* @return*/@GetMapping("/myrank")String getDevicesRank(String deviceId) {Long rank = stringRedisTemplate.opsForZSet().reverseRank(WARNING_COUNT_RANK, deviceId);return String.format("你是第 %s 名", rank + 1);}


http://www.taodudu.cc/news/show-4113244.html

相关文章:

  • 聊聊游戏本推荐排行榜 这一款竟成黑马
  • 聊聊Java那些事儿
  • redis存储新闻列表_聊聊Redis使用场景
  • Python 从底层结构聊 Beautiful Soup 4(内置豆瓣最新电影排行榜爬取案例)
  • 计算机系单身率排行榜,2020中国高校单身率排行榜出炉!附:单身率特别高的专业...
  • 揭晓 2021 编程语言排行榜
  • 聊聊缓存
  • SpringBoot整合Redis实现排行榜功能
  • 聊聊世界编程语言排行榜的事
  • 中国集成灶10大品牌排行榜揭晓,公认的集成灶10大品牌是哪几个?
  • 什么是网段
  • Docker修改默认网段
  • 什么是网段?
  • 内网网段
  • 内网网段范围_局域网网段到底是什么意思?怎么划分的啊?为什么要划分网段?...
  • 不同网段通信的过程
  • linux 跨网段ping,Linux中跨网段ping问题
  • 修改docker ip网段
  • 网段划分 特殊网段(localhost0.0.0.01.1.1.1127.0.0.1)
  • 物理网段
  • java 网段_java IP地址网段计算的示例代码
  • 网段
  • EDTA 最简易安装方法
  • 计算反转录转座子插入时间二:提取成对LTRs序列
  • Gene Pattern
  • DNA甲基化可实现转座因子驱动的基因组扩增
  • RIdeogram 染色体图谱可视化R包
  • Dfam:真核生物转座元件数据库
  • Python生信练习——hg38每条染色体基因,转录本的分布
  • RepeatMasker使用

使用redis实现排行榜相关推荐

  1. redis mysql排行榜实现_redis实现排行榜

    1 前言 实现一个排版榜,我们通常想到的就是mysql的order by 简单粗暴就撸出来了.但是这样真的优雅吗? 数据库是系统的瓶颈,这是众所周知的.如果给你一张百万的表,让你排序做排行榜,花费的时 ...

  2. SpringBoot集成Redis实现排行榜

    SpringBoot继承Redis实现排行榜 项目文件结构 1.修改maven文件 <?xml version="1.0" encoding="UTF-8" ...

  3. 手把手教你使用 Java 和 Redis 实现排行榜!

    编辑:业余草 来源:https://www.xttblog.com/?p=4937 前言 排行榜作为互联网应用中几乎必不可少的一个元素,其能够勾起人类自身对比的欲望,从而来增加商品的销量.排行榜的实现 ...

  4. php TP5 redis 实现排行榜功能 (日榜 周榜 月榜)

    php 结合tp5框架进行redis开发排行榜功能 下面附上我自己封装的redis类:数据持久化我目前是这么想的:同步存:然后定时检测是否过期,或者是否存在在去读数据遍历重新存储 <?php n ...

  5. 【Redis】Redis实现排行榜及相同积分按时间排序

    在日常的开发中,经常会碰到需要对用户的分值等进行排序,比如在游戏里面需要对战斗力进行排行,在组队活动中需要对各个队伍的贡献值进行排行,在微信中需要对各个好友的步数进行排行,此时一般会选择redis的有 ...

  6. 基于Redis的排行榜设计和实现

    基于redis的排行榜设计和实现 一.场景介绍 二.案例设计 1.有序集合命令语法 2.终端测试 1). 添加成绩记录 2).第一次top3查询 3).更新分数 4).再次top-3查询 三.代码示例 ...

  7. 【Redis最佳实践】使用DCS Redis实现排行榜功能

    本节基于华为云DCS Redis实践所编写,用于指导您在以下场景使用DCS Redis实现排行榜功能. 目录 场景介绍 代码示例 实践指导 运行结果 华为云DCS Redis介绍 场景介绍 在网页和A ...

  8. Redis实现排行榜、延迟队列、LRU、消息已读未读(Redisson客户端实现)

    目录 序言 Redis客户端选型 Redis配置 Redis实现排行榜 Redis实现延迟队列 Redis LRU(Least Recently Used)使用 Redis实现消息已读未读 总结 序言 ...

  9. Redis实现排行榜设计

    Redis实现排行榜设计 redis的zset结构有着天然的排序功能,十分适合并发量大的排行功能.通过key值确定排行榜的范围,使用members来作为排序的标识,score作为排序的依据.redis ...

  10. redis实战之使用redis实现排行榜

    转载:http://blog.csdn.net/u011250882/article/details/48632379 设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前2 ...

最新文章

  1. oracle rac启停数据库,Oracle rac 启动停止操作文档 PDF 下载
  2. python中的@符号的作用
  3. C++counting sort计数排序(针对string)的实现算法(附完整源码)
  4. java容器类4:Queue深入解读
  5. [Java网络编程基础]网络编程概述,三要素,IP地址
  6. MS提供的Oracle for ADO 驱动,在一个应用中不能打开同时多个数据库连接
  7. openerp one2many 字段排序
  8. android之list排序
  9. paip.手机ROOT过程总结
  10. js打开新窗口Window.open()方法
  11. 测试开发自我介绍模板
  12. mysql修改字段的名称类型_MySQL修改字段名和字段数据类型
  13. 有哪些常见的电脑硬盘故障?
  14. 囚犯排队红帽子和蓝帽子问题
  15. 网桥工作在计算机网络的,网桥的作用和工作原理是什么
  16. [144]如何用VBS编写一个简单的恶搞脚本
  17. 双系统安装deepin20_记录一次Windows+Deepin双系统安装及简单优化
  18. 如何自学UI设计?如何成为UI设计师?
  19. 如何利用开盘半小时预测当天走势
  20. 论文中文翻译成英文有什么好办法?

热门文章

  1. vue 背景透明度_vue添加星空背景特效
  2. Ubuntu 终端窗口操作快捷键
  3. 计算机云台示意图,智能语音识别云台转动模块电路设计—电路图天天读(70)...
  4. 20元制作笔记本电脑防偷窥神器
  5. 计算机速算训练,世界上最快的速算法,背熟就是速算神童,大脑堪比计算机!仅发一次...
  6. php源码字符串内部表示,PHP源码—implode函数源码分析
  7. 机器学习实战(一)——员工离职预测
  8. 为什么计算机打开u盘这么慢,电脑读取u盘文件速度慢
  9. 学会远程开机之后,发现远程控制软件特别多,哪些好用?哪些免费?
  10. 普林斯顿宣布开源 25 核处理器