面试题答案
一键面试实现思路
- 数据结构选择:使用Redis的有序集合(Sorted Set),其中有序集合的成员(member)为玩家ID,分数(score)为玩家在游戏中的得分。这样Redis会自动根据分数对成员进行排序。
- 实时更新:每当玩家的分数发生变化时,更新有序集合中对应玩家ID的分数。这可以通过
ZADD
命令来完成,即使该玩家ID已经存在于集合中,ZADD
也会更新其分数并重新调整排序。 - 获取排名:可以通过
ZRANK
命令获取某个玩家在排行榜中的排名(从0开始)。如果需要获取某个分数段内的玩家排名情况,可以使用ZRANGEBYSCORE
命令获取该分数段内的所有玩家ID,并按照分数从低到高排序,或者使用ZREVRANGEBYSCORE
获取分数从高到低排序的结果。
相关Redis命令
- 添加或更新玩家分数:
ZADD key score member
key
:排行榜的键名。score
:玩家的分数。member
:玩家ID。 例如,要添加玩家player1
,分数为100到排行榜leaderboard
中,命令为:
ZADD leaderboard 100 player1
- 获取玩家排名:
ZRANK key member
key
:排行榜的键名。member
:玩家ID。 例如,获取玩家player1
在排行榜leaderboard
中的排名:
ZRANK leaderboard player1
- 获取分数段内的玩家排名(分数从低到高):
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
key
:排行榜的键名。min
:分数下限,可以使用-inf
表示负无穷。max
:分数上限,可以使用+inf
表示正无穷。WITHSCORES
:可选参数,若指定则返回结果中会包含每个成员的分数。LIMIT offset count
:可选参数,用于分页,offset
为偏移量,count
为获取的数量。 例如,获取分数在80到100之间的玩家及其分数:
ZRANGEBYSCORE leaderboard 80 100 WITHSCORES
- 获取分数段内的玩家排名(分数从高到低):
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- 与
ZRANGEBYSCORE
类似,只是排序顺序相反,max
在前,min
在后。 例如,获取分数在100到80之间的玩家及其分数(从高到低):
ZREVRANGEBYSCORE leaderboard 100 80 WITHSCORES
- 与