主题
Redis 面试高频题总索引
本文件汇总 14 个章节的高频面试题,按章节归类、按难度标星。 每题完整答案(含「考察点 / 标准答案 / 加分项 / 易错点」)请跳转到对应章节文档的「面试高频题」小节查看。
难度图例
- ⭐ 入门必会(基础题)
- ⭐⭐ 进阶常考
- ⭐⭐⭐ 大厂高频
- ⭐⭐⭐⭐ 资深岗位 / 字节阿里腾讯一面必问
第 1 章 · Redis 是什么 & 为什么快
详细答案见
01_intro.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Redis 为什么这么快? | ⭐⭐⭐ | 内存 / 单线程 / IO 多路复用 / 数据结构 |
| 2 | Redis 是单线程的,为什么还能这么快? | ⭐⭐⭐ | 网络 IO 瓶颈 / O(1) 命令 / 无锁 |
| 3 | Redis 6.0 的多线程是真的多线程吗?解决了什么? | ⭐⭐⭐⭐ | IO 多线程 / 命令执行仍单线程 |
| 4 | 什么是 IO 多路复用?select / poll / epoll 区别? | ⭐⭐⭐ | epoll / 红黑树 / 就绪链表 / O(1) |
| 5 | Redis 是 KV 数据库,是不是只能存字符串? | ⭐ | 5+3 类型 / Stream |
| 6 | Redis 和 Memcached 怎么选? | ⭐⭐ | 数据类型 / 持久化 / 集群 |
第 2 章 · 五大基础数据类型
详细答案见
02_basic_types.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Redis 的 String 最大能存多大?为什么? | ⭐⭐ | 512MB / 大 Key 危害 |
| 2 | embstr 和 raw 的区别?为什么是 44 字节? | ⭐⭐⭐⭐ | jemalloc / 一次 malloc / 只读 |
| 3 | Hash 的底层是什么?什么情况转 hashtable? | ⭐⭐⭐ | listpack / 128 阈值 / 不可逆 |
| 4 | ZSet 为什么用跳表不用红黑树? | ⭐⭐⭐⭐ | 范围查询 / 实现简单 / 并发友好 |
| 5 | Set 和 ZSet 都能去重,怎么选? | ⭐⭐ | 内存 / 是否需要排序 |
| 6 | 用 Redis 实现排行榜怎么做? | ⭐⭐⭐ | ZINCRBY / 同分技巧 / 分桶 |
第 3 章 · 三大特殊数据类型
详细答案见
03_special_types.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 1 亿用户签到状态用什么类型存? | ⭐⭐⭐ | Bitmap / 12.5MB / SETBIT |
| 2 | HLL 原理?为什么 12KB 估算 2^64? | ⭐⭐⭐⭐ | 16384 桶 / 调和平均 / 0.81% 误差 |
| 3 | Redis Geo 怎么实现的?为什么用 ZSet? | ⭐⭐⭐⭐ | GeoHash / 整数 score / 二分编码 |
| 4 | 1 亿 UV 用 Set 还是 HLL? | ⭐⭐⭐ | 16GB vs 12KB / 精确 vs 估算 |
| 5 | Bitmap 适合做什么?什么时候不能用? | ⭐⭐ | 稠密布尔 / offset 警惕 |
| 6 | 怎么实现「附近 1km 的店」? | ⭐⭐⭐ | GEOSEARCH / 集群 HashTag |
第 4 章 · Key 设计与命令进阶
详细答案见
04_key_design.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 为什么生产禁用 KEYS *?用什么替代? | ⭐⭐⭐ | 主线程阻塞 / SCAN / rename-command |
| 2 | SCAN 有哪些「不保证」? | ⭐⭐⭐ | 重复返回 / COUNT 是 hint / 反向二进制 |
| 3 | DEL 和 UNLINK 的区别? | ⭐⭐⭐ | 同步 vs 异步 / BIO 线程 / 大 Key 必用 |
| 4 | Redis 怎么删除过期 Key? | ⭐⭐⭐ | 惰性 + 定期 / hz=10 / 不存在「定时删除」 |
| 5 | SET 命令会改变过期时间吗? | ⭐⭐⭐⭐ | 默认清除 TTL / KEEPTTL / RENAME 继承 |
| 6 | 怎么发现并解决大 Key 问题? | ⭐⭐⭐⭐ | bigkeys / rdb-tools / 拆分 / UNLINK |
第 5 章 · 过期与内存淘汰
详细答案见
05_expire_eviction.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Redis 怎么删除过期 Key?为什么用「惰性 + 定期」组合? | ⭐⭐⭐ | 惰性 + 定期 / hz=10 / expireIfNeeded / 没有定时删除 |
| 2 | 8 种内存淘汰策略分别什么时候用? | ⭐⭐⭐ | noeviction / allkeys-lru / volatile-lfu / volatile-ttl / 决策树 |
| 3 | LRU 和 LFU 的区别?Redis 怎么近似实现 LRU 的? | ⭐⭐⭐⭐ | 24 bit lru 字段 / 采样 5 / 淘汰池 16 / Morris 计数器 |
| 4 | 为什么 Redis 不维护一个真正的 LRU 链表? | ⭐⭐⭐ | 16 字节指针开销 / 1 亿 Key = 1.6GB / 采样精度 95%+ |
| 5 | 主从复制下,从节点会主动删除过期 Key 吗? | ⭐⭐⭐⭐ | 从节点不主动删 / 主节点 DEL 同步 / 3.2 后返回 nil |
| 6 | 缓存场景该用 allkeys-lru 还是 volatile-lru?为什么? | ⭐⭐⭐ | allkeys-lru 推荐 / volatile-* 的 OOM 陷阱 / 物理隔离 |
第 6 章 · 持久化:RDB / AOF / 混合
详细答案见
06_persistence.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | RDB 和 AOF 的区别?怎么选? | ⭐⭐⭐ | 快照 / 命令日志 / 混合持久化 / 选型 |
| 2 | BGSAVE 时如果有客户端写入会怎样?COW 的原理是什么? | ⭐⭐⭐⭐ | fork / 页表 / Copy-On-Write / 内存翻倍 |
| 3 | AOF 三种刷盘策略各有什么权衡? | ⭐⭐⭐ | always / everysec / no / write vs fsync |
| 4 | AOF 重写是怎么做到不阻塞主线程的? | ⭐⭐⭐⭐ | 子进程 / 双写缓冲 / multi-part AOF |
| 5 | 混合持久化解决了什么问题? | ⭐⭐⭐ | RDB 头 + AOF 尾 / 恢复快 + 数据全 |
| 6 | Redis 重启后数据从哪里恢复? | ⭐⭐ | AOF 优先 / appendonly / redis-check-aof |
第 7 章 · 事务、Pipeline、Lua、Pub-Sub、Stream
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Redis 事务支持回滚吗?为什么? | ⭐⭐⭐ | MULTI/EXEC / 不支持回滚 / antirez 设计取舍 |
| 2 | WATCH 是怎么实现乐观锁的? | ⭐⭐⭐ | CAS / watched_keys / DIRTY_CAS 标记 |
| 3 | Pipeline 和事务的区别? | ⭐⭐ | 客户端优化 vs 服务端语义 / 无原子性 |
| 4 | 为什么用 Lua 脚本能实现「读改写」原子性? | ⭐⭐⭐ | 主线程串行 / 脚本不被打断 / EVAL |
| 5 | Pub/Sub 为什么不能用作消息队列?Stream 解决了什么? | ⭐⭐⭐⭐ | 不持久化 / 无 ACK / Stream PEL / Group |
| 6 | Stream 的 Consumer Group 与 Kafka 有什么异同? | ⭐⭐⭐⭐ | 协作消费 + 多 Group 扇出 / 分区与 ACK 粒度 |
第 8 章 · 主从复制
详细答案见
08_replication.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Redis 主从复制的全量同步流程是怎样的? | ⭐⭐⭐ | PSYNC ? -1 / FULLRESYNC / BGSAVE / RDB 传输 / 增量补齐 |
| 2 | 增量同步是怎么做到「断点续传」的? | ⭐⭐⭐⭐ | replid + offset / backlog / CONTINUE |
| 3 | 复制积压缓冲区(backlog)的作用?设置多大合适? | ⭐⭐⭐ | 环形 byte buffer / 写速率 × 容忍秒数 / 64MB 起步 |
| 4 | 主从异步复制有什么问题?怎么实现强一致? | ⭐⭐⭐⭐ | 异步丢数据 / WAIT / min-replicas-to-write |
| 5 | 读写分离会有什么坑? | ⭐⭐⭐ | 写后读旧 / 主从延迟 / loading stale / 写后短期路由到主 |
| 6 | 主从延迟怎么排查和优化? | ⭐⭐⭐ | master-slave offset 差 / 慢命令 / repl-disable-tcp-nodelay |
第 9 章 · 哨兵 Sentinel 高可用
详细答案见
09_sentinel.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 哨兵的核心作用是什么?为什么至少要 3 个? | ⭐⭐⭐ | 监控 / 通知 / 故障转移 / 防脑裂 / 奇数 |
| 2 | SDOWN 和 ODOWN 的区别? | ⭐⭐⭐ | 主观下线 / 客观下线 / quorum / down-after |
| 3 | 哨兵是怎么选 Leader 的? | ⭐⭐⭐⭐ | Raft-like / epoch / 一票制 / majority |
| 4 | 新主节点是按什么规则选出来的? | ⭐⭐⭐⭐ | 5 步过滤:在线 → 响应 → priority → offset → runid |
| 5 | 故障转移期间客户端的请求会失败吗?怎么处理? | ⭐⭐⭐ | +switch-master 订阅 / Sentinel SDK / 重试 + 退避 |
| 6 | 哨兵 + 主从 vs Cluster 集群,怎么选? | ⭐⭐⭐ | 数据量 / 写 QPS / 运维复杂度 |
第 10 章 · Cluster 集群与数据分片
详细答案见
10_cluster.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Redis Cluster 是怎么分片的? | ⭐⭐⭐ | 16384 槽 / CRC16 / 哈希槽 |
| 2 | 为什么是 16384 个槽而不是 65536? | ⭐⭐⭐⭐ | 心跳带宽 2KB / 节点上限 1000 / 压缩率 |
| 3 | 一致性哈希和哈希槽的区别?为什么 Redis 选哈希槽? | ⭐⭐⭐⭐ | 精确控制迁移 / 元信息紧凑 / HashTag |
| 4 | MOVED 和 ASK 的区别? | ⭐⭐⭐ | 永久重定向 vs 临时迁移 / ASKING 通行证 |
| 5 | 集群下能用事务/Lua 吗?HashTag 怎么用? | ⭐⭐⭐ | CROSSSLOT / {tag} / 同槽路由 |
| 6 | Cluster 和哨兵该怎么选? | ⭐⭐⭐ | 数据规模 / 写吞吐 / 运维复杂度 |
| 7 | HashTag 滥用会有什么问题? | ⭐⭐⭐⭐ | 单槽热点 / 数据倾斜 / 迁移困难 |
第 11 章 · 分布式锁
详细答案见
11_distributed_lock.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 怎么用 Redis 实现分布式锁?给出完整命令 | ⭐⭐⭐ | SET key value NX EX / Lua 释放 |
| 2 | 为什么释放锁要用 Lua 脚本? | ⭐⭐⭐⭐ | 校验持有者 + 删除原子 / 防误删 |
| 3 | 锁的「续命」问题是什么?怎么解决? | ⭐⭐⭐⭐ | 看门狗 / Redisson / 守护线程定期续期 |
| 4 | Redlock 是什么?为什么有争议? | ⭐⭐⭐⭐ | N 实例 / majority / Kleppmann vs antirez / fencing token |
| 5 | 主从复制的 Redis 实现锁有什么风险? | ⭐⭐⭐⭐ | 异步复制丢锁 / 双客户端持锁 |
| 6 | 分布式锁 Redis 和 Zookeeper 怎么选? | ⭐⭐⭐ | AP vs CP / 性能 vs 强一致 / 业务可用性容忍 |
第 12 章 · 缓存设计三大问题 + 一致性
详细答案见
12_cache_problems.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 缓存穿透/击穿/雪崩的区别和解决方案? | ⭐⭐⭐ | 不存在 / 单热点过期 / 大量同时过期 / 三套防御 |
| 2 | 布隆过滤器的原理?误差从哪来? | ⭐⭐⭐⭐ | k 个 hash / m 位数组 / 假阳性公式 |
| 3 | 「先更新数据库还是先删缓存」?为什么? | ⭐⭐⭐⭐ | 先 DB 后删 Cache / 4 种顺序时序辨析 |
| 4 | 延迟双删是什么?解决了什么问题? | ⭐⭐⭐ | 更 DB → 删 Cache → sleep → 再删 / 主从延迟 |
| 5 | Cache Aside 模式下如何保证强一致? | ⭐⭐⭐⭐ | 几乎不可能 / 业务可接受最终一致 / 强一致走 DB |
| 6 | 用 Binlog 同步缓存有什么优劣? | ⭐⭐⭐⭐ | Canal / 解耦 / 延迟 / 顺序 / 幂等 |
第 13 章 · 性能优化、监控与排障
详细答案见
13_optimization.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 怎么定位 Redis 变慢?给出排查思路 | ⭐⭐⭐⭐ | 4 层定位:客户端 / 网络 / 主线程 / OS |
| 2 | SLOWLOG 怎么用?看哪些字段? | ⭐⭐⭐ | slower-than 1ms / id / duration / command / client |
| 3 | 内存碎片率多少算正常?怎么处理? | ⭐⭐⭐ | mem_fragmentation_ratio / 1.0~1.5 / activedefrag |
| 4 | Redis 为什么要 fork?fork 耗时长的原因? | ⭐⭐⭐⭐ | BGSAVE / AOF 重写 / 页表大小 / latest_fork_usec |
| 5 | 哪些命令会阻塞主线程?怎么避免? | ⭐⭐⭐ | KEYS / HGETALL / SORT / Lua 超时 / SCAN 系列 |
| 6 | 一个 8 核 32G 的 Redis 单机最多能扛多少 QPS? | ⭐⭐⭐⭐ | 10 万 QPS / Pipeline 提升 / 网络 + CPU 瓶颈 |
第 14 章 · 综合实战:秒杀系统
完整代码 + 架构见
14_seckill.md
本章是进阶思考题而不是面试题(综合应用前 13 章知识,开放式设计):
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 如果库存有 1000 万件怎么办? | ⭐⭐⭐⭐ | 分桶 / 哈希分片 / 多 Redis 实例 |
| 2 | 如果要支持「先到先得排队」怎么实现? | ⭐⭐⭐⭐ | List 排队 / Stream 顺序消费 |
| 3 | 怎么防机器人脚本? | ⭐⭐⭐ | 验证码 / 答题 / 人机识别 / IP 限流 |
| 4 | 多机房部署怎么保证全局库存正确? | ⭐⭐⭐⭐ | 中心库存 + 本地缓存 / 单元化 / Redis 跨机房同步 |
附加面试题(综合性问题):
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 5 | 秒杀系统怎么防止超卖? | ⭐⭐⭐ | Lua 原子扣减 / WATCH / DECR 后回滚对比 |
| 6 | Redis 在秒杀架构中扮演什么角色?怎么和 MQ 配合? | ⭐⭐⭐⭐ | 库存前置 / Stream 异步下单 / 削峰填谷 |
推荐刷题顺序
第一遍按章节顺序刷,建立体系;第二遍按下面的「话题串联」刷,覆盖跨章节的综合题:
- 「快」相关:Ch1 Q1/Q2/Q3/Q4 → Ch2 数据结构 → Ch7 Pipeline/Lua → Ch13 性能优化
- 「持久化」相关:Ch6 RDB/AOF → Ch5 内存淘汰 → Ch8 复制
- 「高可用」相关:Ch8 主从 → Ch9 哨兵 → Ch10 集群
- 「真实场景」相关:Ch4 大 Key/SCAN → Ch11 分布式锁 → Ch12 三大缓存问题 → Ch14 秒杀
- 「面试连环炮」典型组合:
- Redis 为什么快?→ 单线程会有什么问题?→ 6.0 多线程解决什么?→ 一个命令阻塞主线程会怎样?
- String 怎么存的?→ embstr 边界?→ 大 Key 怎么治理?→ UNLINK 是怎么做的?
- 缓存击穿怎么办?→ 加分布式锁怎么做?→ 锁过期了怎么办?→ Redlock 是什么?→ 为啥有争议?
- 主挂了怎么办?→ 哨兵是什么?→ 怎么选 Leader?→ 选错主会有什么问题?→ Cluster 又怎么解决?
速查:本教程统计
- 14 个章节 × 约 6 道高频题 = 80+ 道
- 每章配套:学习文档(500-1000 行) + 2-7 个 Python 代码 + 单文件交互式 demo.html
- 总产出:约 4 万行内容,覆盖 Redis 从入门到资深全部知识点