主题
Redis 高频面试题(蒸馏卡)
来源:聚合
B20-面试下 16 篇 Redis 素材(面试题-Fcant/数据库/Redis/*、面试-叶、面试题专题-蚁群、面试题-老鱼干、吊打面试官之面试题)。同一问题平均在 5 个来源重复 3-5 次,本卡去重合并 + 交叉校正。 使用方法:每题背「一句话标准答」即可;追问链是面试官往下挖的方向。
Q1. Redis 为什么这么快 / 为什么单线程还能高并发?
出现频次:16/16 来源,最高频。 一句话标准答:纯内存 O(1)、单线程串行执行无锁无上下文切换、IO 多路复用扛并发连接。
- 标准答:①数据全在内存;②单线程执行命令,无锁竞争/上下文切换;③IO 多路复用(epoll)单线程监听多 Socket;④高效数据结构 + RESP 协议。
- 追问链:
- Q:那单线程不是浪费多核?→ A:瓶颈在内存/带宽不在 CPU;要扩多用集群/多实例,而非单实例堆线程。
- Q:6.0 多线程是干嘛的?→ A:只做网络 IO/协议解析,命令执行仍单线程(见 概念卡片:Redis为什么这么快)。
- 常见答错点:「Redis 是单线程」不严谨(进程多线程,仅命令执行单线程);误以为 6.0 让命令并行。
Q2. Redis 有哪些数据类型?
出现频次:16/16。 一句话标准答:5 基础(String/List/Hash/Set/ZSet)+ 3 特殊(Bitmap/HyperLogLog/Geo,均为已有结构封装)。
- 标准答:基础类型及能力(String 计数、List 栈/队列、Hash 对象、Set 交并差、ZSet 排行榜);特殊类型用途(Bitmap 签到、HLL 基数、GEO 附近的人)。
- 追问链:
- Q:ZSet 底层?→ A:跳表 + 字典共存(见 概念卡片:Redis数据结构与底层实现)。
- Q:bigkey 危害?→ A:阻塞/网络风暴/过期删除卡顿,渐删 + 打散过期。
- 常见答错点:把 Bitmap/HLL/Geo 当成新底层结构。
Q3. Redis 持久化方式?RDB 和 AOF 区别?
出现频次:16/16。 一句话标准答:RDB 定时快照(fork 子进程、恢复快、丢间隔数据);AOF 写后日志(安全、文件大、恢复慢);4.0 混合兼顾。
- 标准答:RDB vs AOF 对照(启动优先级/体积/恢复速度/安全性);
appendfsync三档;混合持久化aof-use-rdb-preamble。 - 追问链:
- Q:重启加载顺序?→ A:优先 AOF。
- Q:save m n 怎么触发?→ A:serverCron(100ms) + dirty + lastsave 判定(见 概念卡片:Redis持久化-RDB与AOF)。
- 常见答错点:以为 AOF 存数据(实际存命令);以为 RDB 一定阻塞(bgsave 异步);以为持久化=不丢。
Q4. 过期键怎么删除?内存淘汰策略有哪些?
出现频次:15/16。 一句话标准答:过期删除=惰性+定期(不用定时);内存淘汰 8 种(4.0+ 含 LFU),默认 noeviction。
- 标准答:惰性(
expireIfNeeded)+定期(activeExpireCycle);8 种淘汰(allkeys/volatile × lru/lfu/random + volatile-ttl + noeviction);LRU vs LFU。 - 追问链:
- Q:为什么不用定时删除?→ A:CPU 不友好。
- Q:6 种还是 8 种?→ A:4.0 前 6 种,4.0 后 +LFU 两种 = 8 种(见 概念卡片:Redis过期删除与内存淘汰)。
- 常见答错点:说「6 种」(过时);混淆过期删除与内存淘汰是两件事。
Q5. 缓存穿透 / 击穿 / 雪崩?
出现频次:15/16。最高混淆点。 一句话标准答:穿透=查不存在的 key;击穿=热点 key 过期并发查同一条;雪崩=大量 key 同时失效。解法各异。
- 标准答:穿透→校验+空值+布隆过滤器;击穿→互斥锁/逻辑过期;雪崩→错峰过期+高可用+限流降级。
- 追问链:
- Q:布隆过滤器能删吗?→ A:不能,需重建;说不存在则一定不存在。
- Q:三者根本区别?→ A:见 概念卡片:Redis缓存异常三件套-穿透击穿雪崩。
- 常见答错点:把击穿说成「黑客查不存在数据」是穿透,资料普遍混淆,务必分清。
Q6. 缓存与数据库一致性怎么保证?
出现频次:14/16。 一句话标准答:做不到强一致,追求最终一致;推荐「更新 DB → 删缓存」+ 延时双删 + 失败补偿。
- 标准答:三方案对比;Cache-Aside;延时双删伪代码;删缓存失败用 MQ/canal 兜底(见 概念卡片:Redis缓存与数据库一致性)。
- 追问链:
- Q:先删缓存再更新 DB 行吗?→ A:有脏数据窗口,需延时双删。
- Q:能强一致吗?→ A:不能,缓存即副本,双写必有窗口。
- 常见答错点:以为加缓存就一致;以为先删缓存足够。
Q7. 如何用 Redis 实现分布式锁?
出现频次:14/16。 一句话标准答:
SET lock uuid NX EX原子加锁;uuid 防误删;Lua 原子释放;Redisson 看门狗续期。
- 标准答:演进链 setnx→set nx ex→uuid→Lua→看门狗;RedLock 多节点(见 概念卡片:Redis分布式锁)。
- 追问链:
- Q:setnx 后 expire 为啥不行?→ A:非原子,宕机死锁。
- Q:怎么防误删?→ A:uuid 校验 + Lua 原子删除。
- 常见答错点:两步加锁、直接 del、忽略锁过期续期。
Q8. Redis 高可用怎么实现?(主从/哨兵/Cluster)
出现频次:14/16。 一句话标准答:主从复制做冗余/读写分离;哨兵做自动故障转移(仍单 master 写);Cluster 用 16384 槽分片水平扩展。
- 标准答:全量+部分复制(offset/backlog/runid);哨兵选主;Cluster 哈希槽 + gossip + 半数投票选主 + 脑裂
min-slaves-to-write(见 概念卡片:Redis高可用-主从哨兵集群)。 - 追问链:
- Q:Cluster 如何分片?→ A:crc16(key)&0x3fff 映射到槽,槽-节点人工分配。
- Q:脑裂怎么防?→ A:min-slaves-to-write 减少概率,非 100%。
- 常见答错点:以为哨兵能扩展写;以为 Cluster 自动均衡槽位。
Q9. Redis 是单线程还是多线程?
出现频次:12/16。与 Q1 同源但常被单独问。 一句话标准答:命令执行单线程;4.0 lazyfree 后台线程;6.0 多线程仅做 IO 协议解析(默认关)。
- 标准答:见 概念卡片:Redis为什么这么快 的「常见误解」段。
- 追问链:Q:6.0 多线程默认开吗?→ A:默认关,需
io-threads N配置。
Q10. Redis 事务?ACID 支持吗?
出现频次:11/16。 一句话标准答:MULTI/EXEC/DISCARD 串行化执行、无隔离级别、不支持回滚(单条失败其余继续执行)。
- 标准答:三特性——单独隔离操作、无隔离级别概念、不保证原子性(无回滚);可配合 WATCH 乐观锁(CAS)。
- 追问链:Q:事务失败会回滚吗?→ A:不会,已执行命令保留。
Q11. 大量 key 集中过期 / 热点 key 怎么办?
出现频次:10/16。 一句话标准答:过期时间加随机值打散;热点 key 用本地缓存+Redis 多级、逻辑过期、互斥锁防击穿。
- 标准答:打散 TTL 防雪崩;bigkey 用 hscan/sscan/zscan 渐进删除;热点 key 多副本/本地缓存。
Q12. 如何保证 Redis 中只存热点数据(内存有限)?
出现频次:9/16。 一句话标准答:配
maxmemory+allkeys-lru/lfu淘汰,让冷数据自然被踢;结合业务设定 TTL。
- 标准答:用 allkeys-lru 或 volatile-lfu;不设 maxmemory 会 swap 拖垮性能;保证热点即「只留常被访问的」。
关联概念卡
- 原理:Redis技术栈总览、概念卡片:Redis为什么这么快、概念卡片:Redis数据结构与底层实现、概念卡片:Redis持久化-RDB与AOF、概念卡片:Redis过期删除与内存淘汰、概念卡片:Redis高可用-主从哨兵集群、概念卡片:Redis缓存异常三件套-穿透击穿雪崩、概念卡片:Redis缓存与数据库一致性、概念卡片:Redis分布式锁
关联
- 来源:Redis常见面试题(16 篇聚合)
- 相关:Redis技术栈总览