Redis面试想拿高分,先得知道排行榜怎么走,步数攻略别错过
- 问答
- 2025-12-25 07:18:53
- 2
(根据微信公众号“程序员小富”的文章《Redis面试想拿高分,先得知道排行榜怎么走,步数攻略别错过》整理)
Redis的面试里头,排行榜这个问题,出现的频率那是相当高,你要是能把排行榜玩明白了,面试官立马会觉得你基本功扎实,而且有实际的项目经验,为啥排行榜这么重要?因为它太常用了,游戏里的玩家战力排名、电商平台的商品销量榜、社交应用的步数竞赛,哪哪儿都是它,今天咱们就抛开那些晦涩的专业术语,用大白话把Redis实现排行榜的门道给你讲清楚,让你面试的时候能说得头头是道。
核心就靠它:Sorted Set(有序集合)
你别看Redis有五种数据类型,搞排行榜,Sorted Set是当之无愧的“头号玩家”,你可以把它想象成一个特别的集合,里头的每个成员(比如用户ID)都绑定了一个分数(比如步数、销量、分数),它牛在哪儿呢?它能自动根据这个分数给所有成员排座次,而且是按照分数从低到高或者从高到低自动排好,你往里面加成员、改分数,这个顺序瞬间就给你调整好了,效率极高,这就是它最适合做排行榜的根本原因。
实战步数排行榜:从入门到精通
咱们就拿最经典的“微信步数排行榜”当例子,把整个流程走一遍。
-
初始化与添加数据: 假设有三个用户:张三、李四、王五,他们今天的步数分别是10000步、8000步、12000步,用Redis命令就是:
ZADD step_ranking 10000 张三 8000 李四 12000 王五这条命令意思是,往名叫step_ranking的有序集合里,添加了三个成员和他们的分数,执行完后,Redis内部已经按分数排好了:李四(8000)、张三(10000)、王五(12000)。
-
查看总排行榜: 面试官肯定会问你怎么取排行榜,这时候你要分情况说清楚。
- 正序(从低到高):
ZRANGE step_ranking 0 -1 WITHSCORES,这个命令表示从索引0取到最后一个(-1),并且带上分数,结果是:1.李四(8000),2.张三(10000),3.王五(12000)。 - 逆序(从高到低,这才是常见的榜):
ZREVRANGE step_ranking 0 -1 WITHSCORES,结果就是:1.王五(12000),2.张三(10000),3.李四(8000)。 这里你一定要强调ZRANGE和ZREVRANGE的区别,REVreverse(反转)的意思,面试官会觉得你细节把握得很好。
- 正序(从低到高):
-
查看个人排名和步数:
- 查个人排名: 用户关心自己排第几,用
ZREVRANK step_ranking 张三,注意,这里用的是ZREVRANK,因为我们是按分数从高到低排的,返回的结果是1(排名从0开始,所以张三排第二名)。 - 查个人步数:
ZSCORE step_ranking 张三,直接返回10000。
- 查个人排名: 用户关心自己排第几,用
-
更新步数(核心难点): 这是面试官最爱深挖的地方,用户步数是在不断变化的,怎么更新?
- 错误做法: 先查到他旧的分数,在程序里加上新步数,再写回去,这在并发情况下会出大问题!如果两个人同时给张三更新步数,可能会覆盖掉对方的更新。
- 正确做法(展示你的水平): 使用
ZINCRBY step_ranking 500 张三,这个命令非常关键,它的意思是“给张三这个成员的分数增加500步”,Redis保证这个操作是原子性的,也就是说,再多请求同时过来,也是排着队一个一个加,绝对不会错,这才是生产环境的标准做法,你一定要说出来。
进阶玩法:让面试官眼前一亮

如果只讲到上面,那只是及格,想拿高分,你得主动提一些进阶场景。
-
并列排名(分数相同怎么办?) 如果张三和李四都是10000步,谁排前面?Sorted Set的规则是,如果分数相同,就按成员名的字典顺序排,李四”的拼音首字母L在“张三”的Z前面,所以李四会排在张三前面,你可以提一下,如果业务要求同分者按时间先后排,可以把时间戳拼接到成员名里,
张三_1640995200000,这样就能实现同分情况下,先达到这个分数的人排名更靠前。 -
实时更新与定时任务结合 你可以说,在实际项目中,用户的步数可能是实时通过手机上报的,我们可以用上面的
ZINCRBY命令实时更新,但同时,排行榜通常是每天清零或者每周清零的,这时候可以结合一个定时任务,比如每天凌晨,用DEL step_ranking命令删除旧的排行榜,然后开始新的一天的数据统计,这样就构成了一个完整的业务闭环。 -
扩展思路:分段统计 你还可以提一下更复杂的场景,比如游戏里不仅有总榜,还有“今日榜”、“本周榜”、“本月榜”,这很简单,就是创建不同的Key就行了,
ranking:total,ranking:today,ranking:week,这体现了你对业务抽象的能力。
总结一下面试回答要点:
- 核心数据结构: 脱口而出用 Sorted Set(有序集合)。
- 基本操作: 熟练说出
ZADD(增/改),ZREVRANGE(查总榜),ZREVRANK(查个人排名),ZSCORE(查个人分数)。 - 核心亮点: 重点强调更新数据时要用
ZINCRBY保证原子性,避免并发问题,这是区分新手和老手的关键点。 - 进阶思考: 主动提及并列排名处理、多时间段排行榜等扩展场景,展示你的思维深度和项目经验。
你把这条理捋顺了,在面试官面前把这么一个常见的业务场景讲得清清楚楚、深入浅出,他不想给你高分都难,面试官不只是考你Redis命令,更是通过这个问题看你的逻辑思维、实战经验和解决实际问题的能力。
本文由帖慧艳于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/68029.html
