当前位置:首页 > 问答 > 正文

Redis面试想拿高分,先得知道排行榜怎么走,步数攻略别错过

(根据微信公众号“程序员小富”的文章《Redis面试想拿高分,先得知道排行榜怎么走,步数攻略别错过》整理)

Redis的面试里头,排行榜这个问题,出现的频率那是相当高,你要是能把排行榜玩明白了,面试官立马会觉得你基本功扎实,而且有实际的项目经验,为啥排行榜这么重要?因为它太常用了,游戏里的玩家战力排名、电商平台的商品销量榜、社交应用的步数竞赛,哪哪儿都是它,今天咱们就抛开那些晦涩的专业术语,用大白话把Redis实现排行榜的门道给你讲清楚,让你面试的时候能说得头头是道。

核心就靠它:Sorted Set(有序集合)

你别看Redis有五种数据类型,搞排行榜,Sorted Set是当之无愧的“头号玩家”,你可以把它想象成一个特别的集合,里头的每个成员(比如用户ID)都绑定了一个分数(比如步数、销量、分数),它牛在哪儿呢?它能自动根据这个分数给所有成员排座次,而且是按照分数从低到高或者从高到低自动排好,你往里面加成员、改分数,这个顺序瞬间就给你调整好了,效率极高,这就是它最适合做排行榜的根本原因。

实战步数排行榜:从入门到精通

咱们就拿最经典的“微信步数排行榜”当例子,把整个流程走一遍。

  1. 初始化与添加数据: 假设有三个用户:张三、李四、王五,他们今天的步数分别是10000步、8000步、12000步,用Redis命令就是: ZADD step_ranking 10000 张三 8000 李四 12000 王五 这条命令意思是,往名叫 step_ranking 的有序集合里,添加了三个成员和他们的分数,执行完后,Redis内部已经按分数排好了:李四(8000)、张三(10000)、王五(12000)。

    Redis面试想拿高分,先得知道排行榜怎么走,步数攻略别错过

  2. 查看总排行榜: 面试官肯定会问你怎么取排行榜,这时候你要分情况说清楚。

    • 正序(从低到高): 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)。 这里你一定要强调 ZRANGEZREVRANGE 的区别,REV reverse(反转)的意思,面试官会觉得你细节把握得很好。
  3. 查看个人排名和步数:

    • 查个人排名: 用户关心自己排第几,用 ZREVRANK step_ranking 张三,注意,这里用的是 ZREVRANK,因为我们是按分数从高到低排的,返回的结果是1(排名从0开始,所以张三排第二名)。
    • 查个人步数: ZSCORE step_ranking 张三,直接返回10000。
  4. 更新步数(核心难点): 这是面试官最爱深挖的地方,用户步数是在不断变化的,怎么更新?

    • 错误做法: 先查到他旧的分数,在程序里加上新步数,再写回去,这在并发情况下会出大问题!如果两个人同时给张三更新步数,可能会覆盖掉对方的更新。
    • 正确做法(展示你的水平): 使用 ZINCRBY step_ranking 500 张三,这个命令非常关键,它的意思是“给张三这个成员的分数增加500步”,Redis保证这个操作是原子性的,也就是说,再多请求同时过来,也是排着队一个一个加,绝对不会错,这才是生产环境的标准做法,你一定要说出来。

进阶玩法:让面试官眼前一亮

Redis面试想拿高分,先得知道排行榜怎么走,步数攻略别错过

如果只讲到上面,那只是及格,想拿高分,你得主动提一些进阶场景。

  1. 并列排名(分数相同怎么办?) 如果张三和李四都是10000步,谁排前面?Sorted Set的规则是,如果分数相同,就按成员名的字典顺序排,李四”的拼音首字母L在“张三”的Z前面,所以李四会排在张三前面,你可以提一下,如果业务要求同分者按时间先后排,可以把时间戳拼接到成员名里,张三_1640995200000,这样就能实现同分情况下,先达到这个分数的人排名更靠前。

  2. 实时更新与定时任务结合 你可以说,在实际项目中,用户的步数可能是实时通过手机上报的,我们可以用上面的 ZINCRBY 命令实时更新,但同时,排行榜通常是每天清零或者每周清零的,这时候可以结合一个定时任务,比如每天凌晨,用 DEL step_ranking 命令删除旧的排行榜,然后开始新的一天的数据统计,这样就构成了一个完整的业务闭环。

  3. 扩展思路:分段统计 你还可以提一下更复杂的场景,比如游戏里不仅有总榜,还有“今日榜”、“本周榜”、“本月榜”,这很简单,就是创建不同的Key就行了,ranking:total, ranking:today, ranking:week,这体现了你对业务抽象的能力。

总结一下面试回答要点:

  • 核心数据结构: 脱口而出用 Sorted Set(有序集合)。
  • 基本操作: 熟练说出 ZADD(增/改),ZREVRANGE(查总榜),ZREVRANK(查个人排名),ZSCORE(查个人分数)。
  • 核心亮点: 重点强调更新数据时要用 ZINCRBY 保证原子性,避免并发问题,这是区分新手和老手的关键点。
  • 进阶思考: 主动提及并列排名处理、多时间段排行榜等扩展场景,展示你的思维深度和项目经验。

你把这条理捋顺了,在面试官面前把这么一个常见的业务场景讲得清清楚楚、深入浅出,他不想给你高分都难,面试官不只是考你Redis命令,更是通过这个问题看你的逻辑思维、实战经验和解决实际问题的能力。