版权声明:本文为博主原创文章,未经博主允许不得转载。

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 排行榜 相同分数根据时间优先排行相关推荐

  1. 【开发经验】redis排行榜功能(日榜、周榜、月榜)

    文章目录 前言 一.redis实现排行榜 1.新增操作 2.加分值 3.展示榜单 4.查看直播间人数 5.离开直播间 6.周榜 前言 redis中有一个有序集合(sorted set),通过此数据结构 ...

  2. tp6 redis 排行榜

    下载redis 扩展 "predis/predis": "^2.1"    放在composer.json 中 composer update 更新一下即可 然 ...

  3. redis排行榜之日排行周排行设计

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如"用户积分榜".如果没有实效性一直按照总榜来排,可能榜 ...

  4. php redis 排行榜

    <?php $redis = new redis(); $redis->connect('192.168.1.108', 6379); $redis->flushall(); $ar ...

  5. redis排行榜_java_【Redis 源码日志】- Redis 应用:积分排行榜 - Java 技术驿站-Java 技术驿站...

    积分排行榜是 Redis 的经典应用. 倘若数据都存在数据库中,每次访问网页都需要对所有的数据做排序,对于日访问量大的网站来说,不仅服务器吃不消,用户体验也不佳.在 Redis 中提供了 sorted ...

  6. 挂耳耳机十大品牌排行榜哪个好,目前排行靠前的五款耳机推荐

    耳机作为生活的必需品,随着我们生活水平的提高,对于耳机的需求也随之加强,既需要在运动中使用,又要能够在日常佩戴照常无误,那么在此我的建议是对于防水性能一定要高,毕竟高的防水能够抵挡运动中的汗水,也能够 ...

  7. 挂耳式耳机品牌排行榜,五款目前排行靠前的耳机分享

    耳机传声的方式无非就是空气传播以及骨骼传播,而骨传导耳机就属后者,通过骨骼震动来完成声波的传递,在传递的过程无需经过外耳道和鼓膜,在一定程度上缓解了对耳道造成的损伤,减少对于耳道的负担,看到这里如果感 ...

  8. 笔记本电脑推荐2020大学生计算机,笔记本电脑排行榜2020 大学生全能笔记本排行...

    2020年如果要购买全能型笔记本的话,有哪些品牌和型号适合购买,又适合大学生来使用的全能本呢,这里我们来看下几款全能本游戏本推荐,大家在选购的时候可以参考下. 1.联想(Lenovo)小新Air142 ...

  9. list redis 怎样做排行_Redis排行榜的设计与实现

    后知后觉,前几天做的自以为挺满意的排行榜,不正是zset的经典实现么,现在的思路全都是查库的操作,由于业务原因,有些是异步操作,难免存在已经计分,但分数还没有入库,这时去查库,导致与实际的分数不一致的 ...

最新文章

  1. ComplexHeatmap()函数解析
  2. 国内pinterest发展介绍------瀑布流效果
  3. arcsoft panorama maker 6_葫芦娃 本领大——中国邮政将于2020年6月1日发行动画——葫芦兄弟特种邮票...
  4. Python——中国大学MOOC——神经网络与深度学习——Matblotlib绘图基础
  5. linux 设置gbk编码格式,设置ubuntu支持gbk编码格式和设置eclipse 编码格式
  6. python import如何使用_python之import引用
  7. ENSP综合配置 实例十二 实战
  8. is_file()和file_exists()
  9. 框架源码专题:Spring的Aop实现原理,Spring AOP 与 AspectJ 的关系
  10. 诺基亚E5删除自己安装的应用程序
  11. SQLSERVER:sqlserver2008r2安装好后,自动提示功能不可以使用
  12. lucene分词器与搜索
  13. 卸载 Visual Studio 2005
  14. google python代码规范_Python代码这样写才规范优雅! (二)
  15. GraphQL实战经验和性能问题的解决方案
  16. HTML DOM 树形结构
  17. 爱情九十三课,指尖情话
  18. web安全day38:使用Vulhub一键搭建测试靶场
  19. 编译android模拟器,编译Android模拟器(make sdk),以及错误处理
  20. html链接打开word文档,一招教你在Word文档中创建超链接打开其他文件

热门文章

  1. tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)...
  2. JNA参数传递问题,Java数组
  3. 解决Windows和Ubuntu时间不一致的问题
  4. Gridview导出到EXCEL
  5. python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
  6. Rust是如何实现内存安全的--理解RAII/所有权机制/智能指针/引用
  7. MetadataCache分析
  8. (3)QuartusII 封装网表文件(FPGA不积跬步101)
  9. (89)多周期时序约束(四)
  10. mysql用户变量递归_MYSQL递归树查询的实现