当 MySQL 中有 2000 万条数据,而 Redis 仅能容纳约 20 万条数据时,你会采用什么策略来确保 Redis 中缓存的数据始终是热点数据?请阐述具体方案。
考察说明
考察候选人在缓存容量受限时的热点数据识别与缓存淘汰策略设计能力。
回答思路
- 【回答框架 1】核心思路是结合数据访问频率统计与缓存淘汰策略。首先,通过应用层记录每个 key 的访问计数,可以采用 LRU(最近最少使用)或 LFU(最不经常使用)算法,Redis 内置了近似 LRU 和 LFU 淘汰策略,开启 maxmemory 并设置 allkeys-lfu 或 volatile-lfu 策略,让 Redis 自动淘汰低频数据。
- 【回答框架 2】更精确的热点识别可以在应用层维护热点 key 列表,例如使用 Redis 的 zset 按访问次数排序,定期更新热点集合,然后预热这些热点数据到 Redis。同时,淘汰时优先淘汰非热点数据,可以设置不同的过期时间,热点数据不过期或更长过期时间。
- 【回答框架 3】数据加载层面,采用缓存穿透保护(布隆过滤器)、缓存击穿保护(互斥锁或逻辑过期)和缓存雪崩保护(过期时间随机化),确保在热点数据重建时系统稳定。
- 【回答框架 4】监控和调整:通过 Redis 的 INFO 命令统计命中率,根据命中率动态调整热点判定阈值和缓存容量分配,结合访问日志分析,持续优化热点数据集合。
- 【关键点 1】使用 Redis 的 LRU/LFU 淘汰策略作为基础保障
- 【关键点 2】通过访问计数或 zset 维护热点 key 列表,主动管理热点数据
- 【关键点 3】结合过期时间策略和预热机制,保证热点数据常驻缓存
- 【关键点 4】监控命中率并动态调整热点判定逻辑
- 【易错点 1】不能仅依赖 Redis 的近似 LRU,需结合业务访问模式精确识别热点
- 【易错点 2】频繁更新热点列表可能带来额外开销,需控制频率
- 【易错点 3】避免缓存穿透导致热点数据频繁加载数据库,需配合布隆过滤器等防护