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合并。