用Redis做积分排行榜,分分钟帮你冲榜轻松又高效
- 问答
- 2026-01-21 19:55:11
- 4
最近在捣鼓一个社区小程序,用户签到、发帖、点赞都能赚积分,这积分攒着能换点小礼物,本来是个挺能激励用户的好事儿,但问题很快就来了:这积分排行榜怎么做才能又快又好?总不能用户每次想看排名,都得让数据库吭哧吭哧地把所有人的积分算一遍再排序吧?那服务器非得给累趴下不可。
正当我发愁的时候,旁边一位搞后端的大佬瞥了一眼我的屏幕,慢悠悠地说了句:“这种实时性要求高的排行榜,用Redis啊,分分钟搞定,高效得飞起。” 我一听,立马来了精神,赶紧请他指点迷津。
大佬解释说,Redis之所以适合做排行榜,全靠它的一种数据结构——有序集合(Sorted Set),他怕我听不懂专业术语,打了个特别形象的比方:“你就把它想象成一个班级的成绩单,每个学生(成员)都有一个分数(分值),Redis这个‘老师’特别厉害,不仅能根据分数高低瞬间给你排好名次,还能随时帮你查某个学生的排名、查分数段里有多少人,速度都贼快,不管班里有多少学生都一样。”
(来源:Redis官方文档对有序集合数据结构的说明)

他接着给我画了个简单的流程图,告诉我核心步骤就这几步:
- 设计Key:给这个排行榜起个名字,
"user:score:rank",这就是我们那个“成绩单”的封面标题。 - 存入积分:用户每次获得积分,就用
ZADD命令更新他的分数,比如用户A得了100分,命令就是ZADD user:score:rank 100 userA_id,如果用户A后来又得了50分,可以用ZINCRBY user:score:rank 50 userA_id这个命令直接给他加分,特别方便。 - 查询排名:这是最常用的功能。
- 看前100名是谁?用
ZREVRANGE user:score:rank 0 99 WITHSCORES(ZREVRANGE命令是因为Redis默认从小到大排,我们排行榜一般从大到小,所以用REV反向),瞬间就能返回前100名用户的ID和具体积分。 - 想查某个用户排第几?用
ZREVRANK user:score:rank userA_id,立马告诉你他是第几名(从0开始算)。 - 想看看用户A的积分是多少?用
ZSCORE user:score:rank userA_id。
- 看前100名是谁?用
(来源:上述命令均参考自Redis命令手册中对ZADD, ZINCRBY, ZREVRANGE, ZREVRANK, ZSCORE等命令的解释)
我按照大佬的指导,在代码里接入了Redis,把用户积分变动的地方都加上了更新有序集合的逻辑,然后做了个简单的排行榜页面,测试的时候,哪怕我模拟了几十万用户数据,查询top100的排名依然是毫秒级响应,简直丝滑得不像话,以前用数据库查询时那种明显的卡顿感完全消失了。

大佬还给我拓展了几个更高级但很实用的玩法:
- 并列排名处理:如果两个用户积分相同,Redis会按照成员名字典序排,但显示的名次可能是连续的(比如第1、第2),如果想要真正的并列排名(比如积分相同的都排第1,下一个排第3),可以在查询出结果后,在程序里稍微处理一下逻辑,也很简单。
- 多维度排名:比如不仅想看总积分榜,还想看本周积分榜、本月积分榜,这也很简单,多创建几个有序集合的Key就行了,
"user:score:rank:weekly"和"user:score:rank:monthly",更新积分时同时更新对应的榜单。 - 过期与持久化:像周榜、月榜这种临时榜单,可以给Key设置过期时间(TTL),比如7天或30天,到期自动删除,省心省力,Redis也支持数据持久化,不用担心服务器重启数据就没了。
- 查看自己的前后玩家:除了看自己的排名,用户可能还想看看“我前面的那位大佬多少分?”、“我后面的人快追上我了吗?”,这可以用
ZREVRANGE命令,以自己的排名为中心,查询前后若干名的数据,增加榜单的竞争趣味性。
(来源:这些进阶用法是基于Redis有序集合的基本特性,在社区实践和部分技术博客中常见的应用场景拓展)
经过这么一折腾,我算是彻底服气了,用Redis做积分排行榜,真的就像那位大佬说的,是“分分钟帮你冲榜轻松又高效”,它把最耗时的排序和查询工作都揽了过去,而且做得异常出色,让我的小程序在面对大量用户时也能保持流畅的体验,如果你也在为排行榜的性能发愁,真心推荐你试试Redis,绝对是提升效率的神器。
本文由邝冷亦于2026-01-21发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/84161.html
