Skip to content

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 附近的人)。
  • 追问链:
  • 常见答错点:把 Bitmap/HLL/Geo 当成新底层结构。

Q3. Redis 持久化方式?RDB 和 AOF 区别?

出现频次:16/16。 一句话标准答:RDB 定时快照(fork 子进程、恢复快、丢间隔数据);AOF 写后日志(安全、文件大、恢复慢);4.0 混合兼顾。

  • 标准答:RDB vs AOF 对照(启动优先级/体积/恢复速度/安全性);appendfsync 三档;混合持久化 aof-use-rdb-preamble
  • 追问链:
  • 常见答错点:以为 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。
  • 追问链:
  • 常见答错点:说「6 种」(过时);混淆过期删除与内存淘汰是两件事。

Q5. 缓存穿透 / 击穿 / 雪崩?

出现频次:15/16。最高混淆点。 一句话标准答:穿透=查不存在的 key;击穿=热点 key 过期并发查同一条;雪崩=大量 key 同时失效。解法各异。

  • 标准答:穿透→校验+空值+布隆过滤器;击穿→互斥锁/逻辑过期;雪崩→错峰过期+高可用+限流降级。
  • 追问链:
  • 常见答错点:把击穿说成「黑客查不存在数据」是穿透,资料普遍混淆,务必分清。

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 协议解析(默认关)。

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 拖垮性能;保证热点即「只留常被访问的」。

关联概念卡

关联

最近更新