news 2026/5/31 1:19:18

如何设计一个排行榜?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何设计一个排行榜?

Redis Sorted Set 实现排行榜基础

使用 Redis 的 Sorted Set(有序集合)是实现排行榜的高效方案。Sorted Set 通过ZADD命令添加成员和分数,自动按分数排序。例如,添加用户得分:

ZADD leaderboard 1000 "user1" ZADD leaderboard 800 "user2"

分数可以是整数或浮点数,排序默认从高到低(ZREVRANGE)或从低到高(ZRANGE)。

实时更新策略

更新用户分数时,使用ZADD直接覆盖旧分数或通过ZINCRBY累加分数:

ZADD leaderboard 1200 "user1" # 直接更新 ZINCRBY leaderboard 200 "user2" # 增加200分

对于高频写入场景,可通过管道(pipeline)批量操作减少网络开销:

MULTI ZADD leaderboard 1500 "user3" ZINCRBY leaderboard 50 "user1" EXEC

分页查询优化

分页查询使用ZREVRANGE获取排名范围内的成员(0-based):

ZREVRANGE leaderboard 0 9 WITHSCORES # 获取前10名 ZREVRANGE leaderboard 10 19 WITHSCORES # 第2页(每页10条)

若需获取用户排名,使用ZREVRANK

ZREVRANK leaderboard "user1" # 返回排名(从0开始)

海量数据性能优化

当数据量极大时(如千万级),需考虑以下优化:

  • 分片:按用户ID哈希分片到多个 Sorted Set,查询时聚合结果。
  • 冷热分离:活跃数据存 Redis,历史数据定期归档到数据库。
  • 内存控制:通过zset-max-ziplist-entries调整编码方式,平衡内存与性能。

扩展功能示例

并列排名处理
Redis 默认按分数排序,相同分数按字典序排。若需完全并列,可追加时间戳到分数:

ZADD leaderboard 1000.12345 "user1" # 末尾为时间戳

多维度排序
如需按分数和时间排序,可将时间戳作为二级分数存入另一个 Sorted Set,查询时用ZINTERSTORE合并。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 1:18:19

Go 接口从入门到通透:一篇搞定你所有疑惑

刚学 Go 接口的时候,你是不是也被这些问题搞懵过?接口里的方法为什么没有接收者?怎么知道谁实现了它?为什么空接口什么类型都能装?和普通接口有啥不一样?给int包个自定义类型就能实现接口?接口类…

作者头像 李华
网站建设 2026/5/31 1:17:07

避坑指南:海康威视SDK布防报警(NET_DVR_SetupAlarmChan_V41)参数配置的那些“坑”

海康威视SDK布防报警参数配置实战解析1. 布防参数配置的核心逻辑海康威视设备布防报警功能的核心在于NET_DVR_SETUPALARM_PARAM结构体的正确配置。这个结构体包含了多个关键参数,每个参数都直接影响着报警信息的传输方式和处理逻辑。byLevel参数决定了报警信息的优先…

作者头像 李华
网站建设 2026/5/31 1:17:07

用Python玩转时空数据分析:手把手教你用mgtwr包实现GTWR模型(附完整代码)

Python时空数据分析实战:GTWR模型从原理到商业应用 时空数据分析正在成为商业决策、城市规划与环境监测等领域的核心技术。当传统的地理加权回归(GWR)遇上时间维度,GTWR模型便展现出其独特价值——它能捕捉变量关系如何随地理位置和时间变化而动态演变。…

作者头像 李华