使用redis实现排行榜
写在前面
排行榜在很多地方都能使用到,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实现排行榜相关推荐
- redis mysql排行榜实现_redis实现排行榜
1 前言 实现一个排版榜,我们通常想到的就是mysql的order by 简单粗暴就撸出来了.但是这样真的优雅吗? 数据库是系统的瓶颈,这是众所周知的.如果给你一张百万的表,让你排序做排行榜,花费的时 ...
- SpringBoot集成Redis实现排行榜
SpringBoot继承Redis实现排行榜 项目文件结构 1.修改maven文件 <?xml version="1.0" encoding="UTF-8" ...
- 手把手教你使用 Java 和 Redis 实现排行榜!
编辑:业余草 来源:https://www.xttblog.com/?p=4937 前言 排行榜作为互联网应用中几乎必不可少的一个元素,其能够勾起人类自身对比的欲望,从而来增加商品的销量.排行榜的实现 ...
- php TP5 redis 实现排行榜功能 (日榜 周榜 月榜)
php 结合tp5框架进行redis开发排行榜功能 下面附上我自己封装的redis类:数据持久化我目前是这么想的:同步存:然后定时检测是否过期,或者是否存在在去读数据遍历重新存储 <?php n ...
- 【Redis】Redis实现排行榜及相同积分按时间排序
在日常的开发中,经常会碰到需要对用户的分值等进行排序,比如在游戏里面需要对战斗力进行排行,在组队活动中需要对各个队伍的贡献值进行排行,在微信中需要对各个好友的步数进行排行,此时一般会选择redis的有 ...
- 基于Redis的排行榜设计和实现
基于redis的排行榜设计和实现 一.场景介绍 二.案例设计 1.有序集合命令语法 2.终端测试 1). 添加成绩记录 2).第一次top3查询 3).更新分数 4).再次top-3查询 三.代码示例 ...
- 【Redis最佳实践】使用DCS Redis实现排行榜功能
本节基于华为云DCS Redis实践所编写,用于指导您在以下场景使用DCS Redis实现排行榜功能. 目录 场景介绍 代码示例 实践指导 运行结果 华为云DCS Redis介绍 场景介绍 在网页和A ...
- Redis实现排行榜、延迟队列、LRU、消息已读未读(Redisson客户端实现)
目录 序言 Redis客户端选型 Redis配置 Redis实现排行榜 Redis实现延迟队列 Redis LRU(Least Recently Used)使用 Redis实现消息已读未读 总结 序言 ...
- Redis实现排行榜设计
Redis实现排行榜设计 redis的zset结构有着天然的排序功能,十分适合并发量大的排行功能.通过key值确定排行榜的范围,使用members来作为排序的标识,score作为排序的依据.redis ...
- redis实战之使用redis实现排行榜
转载:http://blog.csdn.net/u011250882/article/details/48632379 设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前2 ...
最新文章
- oracle rac启停数据库,Oracle rac 启动停止操作文档 PDF 下载
- python中的@符号的作用
- C++counting sort计数排序(针对string)的实现算法(附完整源码)
- java容器类4:Queue深入解读
- [Java网络编程基础]网络编程概述,三要素,IP地址
- MS提供的Oracle for ADO 驱动,在一个应用中不能打开同时多个数据库连接
- openerp one2many 字段排序
- android之list排序
- paip.手机ROOT过程总结
- js打开新窗口Window.open()方法
- 测试开发自我介绍模板
- mysql修改字段的名称类型_MySQL修改字段名和字段数据类型
- 有哪些常见的电脑硬盘故障?
- 囚犯排队红帽子和蓝帽子问题
- 网桥工作在计算机网络的,网桥的作用和工作原理是什么
- [144]如何用VBS编写一个简单的恶搞脚本
- 双系统安装deepin20_记录一次Windows+Deepin双系统安装及简单优化
- 如何自学UI设计?如何成为UI设计师?
- 如何利用开盘半小时预测当天走势
- 论文中文翻译成英文有什么好办法?
热门文章
- vue 背景透明度_vue添加星空背景特效
- Ubuntu 终端窗口操作快捷键
- 计算机云台示意图,智能语音识别云台转动模块电路设计—电路图天天读(70)...
- 20元制作笔记本电脑防偷窥神器
- 计算机速算训练,世界上最快的速算法,背熟就是速算神童,大脑堪比计算机!仅发一次...
- php源码字符串内部表示,PHP源码—implode函数源码分析
- 机器学习实战(一)——员工离职预测
- 为什么计算机打开u盘这么慢,电脑读取u盘文件速度慢
- 学会远程开机之后,发现远程控制软件特别多,哪些好用?哪些免费?
- 普林斯顿宣布开源 25 核处理器