Redis 排行榜 相同分数根据时间优先排行
版权声明:本文为博主原创文章,未经博主允许不得转载。
1. 需求
Redis 提供了按分数进行排序的有序集合。 比如在游戏里面,比如战斗力排行,充值排行,用默认的Redis 实现就可以达到需求。
但是,比如等级排行,大家都是30级,谁先到30级谁第一。Redis 默认实现是,相同分数的成员按字典顺序排序(0 ~9 , A ~Z,a ~ z),所以相同分数排序就不能根据时间优先来排序。
需要设计一个 【分数 = 等级 + 时间】 ,谁分数大谁第一,最后再根据分数能解析出来等级即可。
2.设计
分数 = 等级 + 时间 (当前系统时间戳)
分数是 64位的长整型 Long (有符号)
1) 设计方式一
long 分数,二进制用高 32位存 等级,低32位存时间(秒精度),那么数据看起是这样
A 玩家, 10 + 1111111111(时间戳)
后来 B 玩家也到 10 级, 10 + 2222222222(时间戳)
这样排序,最终还是 B 玩家 会排到第一名,不能达到目的。
2) 设计方式二
long 整数长度总共有 19位,923XXX.......,时间戳 毫秒精度 是 13位,所以只需 14 ~ 19 位存 等级,其他13位存时间。接下来看怎么存。
等级偏移: Math.power(10, 14) = 10000000000000000(14位)
这里有一个最大时间 MAX_TIME = 9999999999999 (13位)
A 玩家,(10 * 等级偏移) + MAX_TIME - 11111111111111( 时间戳),最终分数 10888888888888888
B 玩家,(10 * 等级偏移) + MAX_TIME - 22222222222222( 时间戳),最终分数 10777777777777777
最终排序,A 玩家依然是第一。通过分数可以解析出真实 【等级 = 分数 / 等级偏移,取整】
3. 劣势
1) 如果有三个,四个排序条件怎么办,这种情况还是推荐使用数据库,就别考虑 Redis了 。Redis 优势在于可以做到实时排行
2) 方式二 14 ~ 19位,那么等级最大数据就只能是 919999,超过这个数就会溢出。可以把时间戳降低到秒级别,可以支持更大数字
4. 总结
以上设计主要还是针对游戏内排行榜,并不能涵盖所有行业,只能说是借鉴作用,仅供参考。
// 万仙阵排名变化
public void updateWanxianzhePoints(final String avatarId, final int points) {
jedisTemplate.execute(new JedisCallback() {
@Override
public Object doInJedis(Jedis jedis) {
long updateTime = System.currentTimeMillis();
double timeRank = points + 1 - updateTime / Math.pow(10, (int) Math.log10(updateTime) + 1);
jedis.zadd(FsGameDbConstants.KEY_LIST_WANXIANZHEN_POINTS, timeRank, avatarId);
LoggerHelper.infoParams("updateWanxianzhePoints avatarId=", avatarId, " points=", points);
return null;
}
});
}
取出来转化成整型
int points = Double.valueOf(rr.getScore()).intValue();
转载于:https://www.cnblogs.com/cci8go/p/5964485.html
Redis 排行榜 相同分数根据时间优先排行相关推荐
- 【开发经验】redis排行榜功能(日榜、周榜、月榜)
文章目录 前言 一.redis实现排行榜 1.新增操作 2.加分值 3.展示榜单 4.查看直播间人数 5.离开直播间 6.周榜 前言 redis中有一个有序集合(sorted set),通过此数据结构 ...
- tp6 redis 排行榜
下载redis 扩展 "predis/predis": "^2.1" 放在composer.json 中 composer update 更新一下即可 然 ...
- redis排行榜之日排行周排行设计
排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如"用户积分榜".如果没有实效性一直按照总榜来排,可能榜 ...
- php redis 排行榜
<?php $redis = new redis(); $redis->connect('192.168.1.108', 6379); $redis->flushall(); $ar ...
- redis排行榜_java_【Redis 源码日志】- Redis 应用:积分排行榜 - Java 技术驿站-Java 技术驿站...
积分排行榜是 Redis 的经典应用. 倘若数据都存在数据库中,每次访问网页都需要对所有的数据做排序,对于日访问量大的网站来说,不仅服务器吃不消,用户体验也不佳.在 Redis 中提供了 sorted ...
- 挂耳耳机十大品牌排行榜哪个好,目前排行靠前的五款耳机推荐
耳机作为生活的必需品,随着我们生活水平的提高,对于耳机的需求也随之加强,既需要在运动中使用,又要能够在日常佩戴照常无误,那么在此我的建议是对于防水性能一定要高,毕竟高的防水能够抵挡运动中的汗水,也能够 ...
- 挂耳式耳机品牌排行榜,五款目前排行靠前的耳机分享
耳机传声的方式无非就是空气传播以及骨骼传播,而骨传导耳机就属后者,通过骨骼震动来完成声波的传递,在传递的过程无需经过外耳道和鼓膜,在一定程度上缓解了对耳道造成的损伤,减少对于耳道的负担,看到这里如果感 ...
- 笔记本电脑推荐2020大学生计算机,笔记本电脑排行榜2020 大学生全能笔记本排行...
2020年如果要购买全能型笔记本的话,有哪些品牌和型号适合购买,又适合大学生来使用的全能本呢,这里我们来看下几款全能本游戏本推荐,大家在选购的时候可以参考下. 1.联想(Lenovo)小新Air142 ...
- list redis 怎样做排行_Redis排行榜的设计与实现
后知后觉,前几天做的自以为挺满意的排行榜,不正是zset的经典实现么,现在的思路全都是查库的操作,由于业务原因,有些是异步操作,难免存在已经计分,但分数还没有入库,这时去查库,导致与实际的分数不一致的 ...
最新文章
- ComplexHeatmap()函数解析
- 国内pinterest发展介绍------瀑布流效果
- arcsoft panorama maker 6_葫芦娃 本领大——中国邮政将于2020年6月1日发行动画——葫芦兄弟特种邮票...
- Python——中国大学MOOC——神经网络与深度学习——Matblotlib绘图基础
- linux 设置gbk编码格式,设置ubuntu支持gbk编码格式和设置eclipse 编码格式
- python import如何使用_python之import引用
- ENSP综合配置 实例十二 实战
- is_file()和file_exists()
- 框架源码专题:Spring的Aop实现原理,Spring AOP 与 AspectJ 的关系
- 诺基亚E5删除自己安装的应用程序
- SQLSERVER:sqlserver2008r2安装好后,自动提示功能不可以使用
- lucene分词器与搜索
- 卸载 Visual Studio 2005
- google python代码规范_Python代码这样写才规范优雅! (二)
- GraphQL实战经验和性能问题的解决方案
- HTML DOM 树形结构
- 爱情九十三课,指尖情话
- web安全day38:使用Vulhub一键搭建测试靶场
- 编译android模拟器,编译Android模拟器(make sdk),以及错误处理
- html链接打开word文档,一招教你在Word文档中创建超链接打开其他文件
热门文章
- tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)...
- JNA参数传递问题,Java数组
- 解决Windows和Ubuntu时间不一致的问题
- Gridview导出到EXCEL
- python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
- Rust是如何实现内存安全的--理解RAII/所有权机制/智能指针/引用
- MetadataCache分析
- (3)QuartusII 封装网表文件(FPGA不积跬步101)
- (89)多周期时序约束(四)
- mysql用户变量递归_MYSQL递归树查询的实现