Redis 面试高频 100 题
定位: 按板块分类的面试题,用于检验知识库的掌握程度 使用方式: 先读 **Redis文库设计文档** 按顺序学 → 再用这些题自测
每题标注考察点和关联笔记,每个问题链接回对应的原理笔记
一、基础与架构
1.1 Redis 为什么这么快?
考察点:存储模型、网络模型、数据结构 核心:内存计算(ns级) + 单线程(无锁/无上下文切换) + I/O多路复用(epoll) + 高效数据结构 → 详阅 **Redis设计哲学与适用场景**
1.2 单线程的 Redis 如何支撑高并发?
考察点:事件循环理解 核心:epoll I/O 多路复用 + 单线程事件循环,把等待 I/O 的时间用来处理其他请求 → 详阅 **单线程模型与IO多路复用**
1.3 Redis 6.0 的多线程改了哪些?
考察点:多线程演进 核心:网络 I/O 多线程,命令解析和执行仍然是单线程 → 详阅 **单线程模型与IO多路复用**
1.4 select/poll/epoll 的区别?
考察点:I/O 多路复用原理 核心:select 1024 限制+O(n);poll 无限制+O(n);epoll 回调+O(1)+mmap → 详阅 **单线程模型与IO多路复用**
1.5 Redis 和 Memcached 的区别?
考察点:选型对比 核心:数据结构丰富度、持久化、高可用、单线程 vs 多线程 → 详阅 **Redis设计哲学与适用场景**
1.6 RESP 协议的五种类型是什么?
考察点:协议理解 核心:+(简单字符串)/ -(错误)/ :(整数)/ $(批量字符串)/ *(数组) → 详阅 **RESP协议与通信模型**
1.7 Pipeline 的作用和风险?
考察点:网络优化 核心:减少 RTT,批量发送提高吞吐;风险是输出缓冲区膨胀 → 详阅 **Pipeline与批量操作**
1.8 Redis 为什么用单线程?
考察点:架构设计权衡 核心:瓶颈在内存/网络不在 CPU;单线程避免锁/上下文切换;6.0 网络 I/O 可配多线程 → 详阅 **单线程模型与IO多路复用**
二、数据结构
2.1 SDS 相比 C 字符串的优势?
考察点:底层数据结构 核心:O(1)长度、二进制安全、预分配扩容、惰性释放 → 详阅 **String与SDS**
2.2 String 的三种编码?
考察点:内存优化 核心:INT(整数直接存)/ EMBSTR(≤44B 一次分配)/ RAW(>44B 两次分配) → 详阅 **String与SDS**
2.3 Quicklist 的结构和优势?
考察点:List 底层 核心:分段 ziplist + 双向指针,兼顾压缩省内存和扩展性 → 详阅 **List与Quicklist**
2.4 Hash 什么时候用 ziplist,什么时候用 hashtable?
考察点:编码切换 核心:entry≤512 且 value≤64B 时 ziplist;超阈值转 hashtable(不可逆) → 详阅 **Hash底层实现**
2.5 渐进式 Rehash 是如何工作的?
考察点:重哈希过程 核心:每次操作搬一个 bucket;读查两个表;写只写新表 → 详阅 **Hash底层实现**
2.6 Set 的 intset 升级机制?
考察点:整数集合 核心:插入更大范围的整数时自动升级编码(int16→int32→int64),只升不降 → 详阅 **Set底层实现**
2.7 为什么 ZSet 用跳表不用红黑树?
考察点:数据结构选型 核心:实现简单、范围查询天然支持、不需要重平衡 → 详阅 **ZSet与SkipList**
2.8 跳表的层高怎么确定?
考察点:跳表原理 核心:随机确定,每次 25% 概率升一层,最大 32 层 → 详阅 **ZSet与SkipList**
2.9 Stream 和 List 做消息队列的区别?
考察点:消息模式 核心:Stream 有消费组/ACK/消息 ID/多播;List 简单无确认 → 详阅 **Stream消息队列**
2.10 HyperLogLog 的原理和误差?
考察点:概率算法 核心:伯努利试验 + 16384 个桶取调和平均;~0.81% 误差;12KB 固定内存 → 详阅 **高级数据结构**
三、持久化
3.1 RDB 和 AOF 的区别?
考察点:持久化策略理解 核心:RDB 全量快照(恢复快、可能丢数据);AOF 增量日志(丢数据少、恢复慢) → 详阅 **RDB快照机制**、**AOF日志机制**
3.2 AOF 的三种 fsync 策略?
考察点:写入策略 核心:always(最安全最慢)/ everysec(推荐)/ no(最快但不安全) → 详阅 **AOF日志机制**
3.3 AOF rewrite 的流程?
考察点:重写机制 核心:fork 子进程遍历数据生成最小命令集 + 父进程增量缓存 + 合并替换 → 详阅 **AOF日志机制**
3.4 写时复制(COW)如何影响 RDB?
考察点:fork 原理 核心:fork 不复制物理内存;父进程写入触发 COW 复制页面;大量写入时内存可能翻倍 → 详阅 **RDB快照机制**
3.5 混合持久化是怎么工作的?
考察点:4.0+ 新特性 核心:AOF 文件 = RDB 头部 + AOF 增量尾部,整合两者优势 → 详阅 **混合持久化与最佳实践**
3.6 生产环境的持久化如何配置?
考察点:工程实践 核心:主节点 AOF everysec + 混合模式;从节点 RDB;大内存主节点不持久化 → 详阅 **混合持久化与最佳实践**
四、高可用与集群
4.1 主从复制全量复制过程?
考察点:复制流程 核心:PSYNC → RDB 传输 → 缓冲命令重放 → 增量复制 → 详阅 **主从复制原理**
4.2 PSYNC2 解决了什么问题?
考察点:复制优化 核心:主节点重启后 runid 不变,从节点不需要全量复制 → 详阅 **主从复制原理**
4.3 复制积压缓冲区的作用?
考察点:增量复制 核心:环形缓冲区记录最近操作,短时断线的从节点可以增量同步 → 详阅 **主从复制原理**
4.4 主从复制是同步还是异步?
考察点:一致性 核心:异步。主节点写入即返回,从节点异步同步 → 最终一致性 → 详阅 **主从复制原理**
4.5 SDOWN 和 ODOWN 的区别?
考察点:Sentinel 判断逻辑 核心:SDOWN 一个哨兵主观判断;ODOWN quorum 个哨兵确认后触发切换 → 详阅 **哨兵Sentinel机制**
4.6 Sentinel 怎么选主的?
考察点:故障转移 核心:排除不可用 → 按优先级 → 按复制偏移量 → 按 runid → 详阅 **哨兵Sentinel机制**
4.7 哨兵的脑裂问题怎么解决?
考察点:分布式问题 核心:min-slaves-to-write + min-slaves-max-lag 限制分区期间写入 → 详阅 **哨兵Sentinel机制**
4.8 Cluster 的哈希槽数量为什么是 16384?
考察点:设计决策 核心:心跳包大小(16384 bit=2KB)、对 ≤1000 节点足够均衡 → 详阅 **数据分片与哈希槽**
4.9 MOVED 和 ASK 的区别?
考察点:集群路由 核心:MOVED 永久迁移→更新槽表;ASK 临时迁移→不更新槽表 → 详阅 **Redis Cluster架构**
4.10 Cluster 的故障检测流程?
考察点:集群容错 核心:节点超时→PFAIL→Gossip 传播→多数确认→FAIL→从节点选举升级 → 详阅 **Redis Cluster架构**
五、缓存设计
5.1 缓存穿透、击穿、雪崩的区别?
考察点:三大问题理解 核心:穿透(查不存在)/ 击穿(热点过期)/ 雪崩(批量过期) → 详阅 **缓存穿透击穿雪崩**
5.2 缓存穿透的解决方案?
考察点:问题处理 核心:布隆过滤器(推荐)/ 缓存空值 / 参数校验 → 详阅 **缓存穿透击穿雪崩**
5.3 缓存击穿的解决方案?
考察点:问题处理 核心:互斥锁(SETNX)/ 逻辑永不过期 / 主动续期 → 详阅 **缓存穿透击穿雪崩**
5.4 缓存雪崩的解决方案?
考察点:问题处理 核心:过期时间随机化 / 服务降级 / 限流 / 多副本 → 详阅 **缓存穿透击穿雪崩**
5.5 Cache Aside 模式为什么删缓存而不更新?
考察点:一致性策略 核心:删除更简单(原子操作),避免写-写竞争 → 详阅 **缓存一致性方案**
5.6 延迟双删的原理和问题?
考察点:一致性方案 核心:先删→写库→延迟→再删;sleep 时间不好确定 → 详阅 **缓存一致性方案**
5.7 分布式锁的三大要素?
考察点:锁设计 核心:互斥 / 自动过期防死锁 / 容错 → 详阅 **分布式锁实现**
5.8 Redis 分布式锁看门狗是什么?
考察点:锁续期 核心:后台线程自动续期(每 10 秒续到 30 秒),客户端挂了自然释放 → 详阅 **分布式锁实现**
5.9 固定窗口和滑动窗口限流的区别?
考察点:限流算法 核心:固定窗口有边界突刺;滑动窗口更平滑 → 详阅 **限流与计数器设计**
5.10 令牌桶和漏桶的区别?
考察点:流量整形 核心:令牌桶允许短时突发;漏桶强制恒速输出 → 详阅 **限流与计数器设计**
六、性能优化
6.1 Redis 内存淘汰策略有哪些?
考察点:内存管理 核心:allkeys-lru(推荐)/ allkeys-lfu / volatile-ttl / noeviction 等 8 种 → 详阅 **内存优化策略**
6.2 内存碎片率(mem_fragmentation_ratio)过高怎么办?
考察点:运维实践 核心:>1.5 启动 activedefrag;<1.0 检查 swap → 详阅 **内存优化策略**
6.3 Big Key 的危害和发现方法?
考察点:生产问题 核心:阻塞服务/内存不均/网络带宽;redis-cli --bigkeys 扫描 → 详阅 **内存优化策略**
6.4 如何排查 Redis 延迟突增?
考察点:问题排查 核心:--latency → SLOWLOG → 网络 → fork → 大 key → 详阅 **慢查询与性能诊断**
6.5 Pipeline 和事务的区别?
考察点:功能对比 核心:Pipeline 减 RTT(非原子);事务保原子性;可同时使用 → 详阅 **Pipeline与批量操作**
七、进阶
7.1 Redis 事务支持回滚吗?
考察点:事务理解 核心:不支持回滚。运行时错误不影响其他命令执行 → 详阅 **事务与Lua脚本**
7.2 WATCH 乐观锁怎么工作?
考察点:CAS 机制 核心:WATCH key → 事务执行前检查 key 是否被改 → 被改则事务取消 → 详阅 **事务与Lua脚本**
7.3 Lua 脚本的优势?
考察点:脚本理解 核心:原子执行、条件逻辑、减少网络往返、可复用 → 详阅 **事务与Lua脚本**
7.4 Pub/Sub 消息会丢失吗?
考察点:消息模式 核心:会。客户端断开期间的消息丢失,缓冲区满强制断开 → 详阅 **发布订阅与消息机制**
7.5 什么时候用 List、Pub/Sub、Stream?
考察点:消息选型 核心:简单队列→List;广播通知→Pub/Sub;可靠消息→Stream → 详阅 **Stream消息队列**、**发布订阅与消息机制**
📚 相关链接
- **总纲设计文档**
- **综合真题解析**