面试题答案
一键面试适用业务场景
- 排行榜类业务:例如游戏排行榜、网站文章热度排行等。在这类场景中,需要根据某个数值(如分数、点赞数等)对大量数据进行排序展示。MySQL本身处理大规模数据排序性能会逐渐下降,而Redis有序集合天然支持根据分数进行排序,能快速获取排名靠前或特定范围内的数据。
- 时效性要求高的查询:当数据的时效性非常关键,如实时的商品销量排名、股票价格实时排名等。Redis的高性能读写以及有序集合的快速排序能力,能保证在短时间内获取最新的排序结果,满足实时性需求。
- 范围查询优化:如果需要频繁地根据某个数值范围进行查询,比如查询成绩在80 - 90分之间的学生列表。MySQL对于范围查询在数据量较大时性能可能不佳,而Redis有序集合可以高效地进行范围查询。
举例说明
以游戏玩家的积分排行榜为例:
- MySQL表结构:假设存在一个
players
表,包含player_id
(玩家ID)和score
(积分)字段。
CREATE TABLE players (
player_id INT PRIMARY KEY,
score INT
);
- 使用Redis有序集合:在Redis中,以
player_score_rank
作为有序集合的键,将玩家ID作为成员,积分作为分数。例如,玩家1的积分为100,在Redis中可以这样操作:
ZADD player_score_rank 100 1
- 查询操作:
- 获取排行榜前10名:在Redis中,直接使用
ZRANGE player_score_rank 0 9 WITHSCORES
命令,能快速获取积分排名前10的玩家ID及对应的积分。而如果在MySQL中执行SELECT player_id, score FROM players ORDER BY score DESC LIMIT 10
,当数据量较大时,排序操作会消耗较多资源和时间。 - 获取特定玩家排名:在Redis中,使用
ZRANK player_score_rank [player_id]
可以快速获取某个玩家的排名。在MySQL中则可能需要通过复杂的子查询来实现类似功能,性能相对较低。
- 获取排行榜前10名:在Redis中,直接使用