# 1. Redis 为什么选择单线程模型处理命令?单线程为何仍能达到十万级 QPS(纯内存操作、IO 多路复用、避免锁竞争与上下文切换)? A 单线程模型无法达到高 QPS B Redis 瓶颈在 CPU 计算 C 单线程避免锁竞争与上下文切换,配合 IO 多路复用达到高 QPS ✓ 正确答案 D 单线程让命令执行需要加锁
# 2. Redis 的 IO 多路复用底层(Linux epoll、macOS kqueue)与 select/poll 的本质差异(fd 数量限制、O(n) 遍历、水平触发 LT 与边缘触发 ET)是什么? A epoll 由内核维护就绪链表,无需用户遍历全部 fd ✓ 正确答案 B select 无 fd 数量限制 C epoll 是 O(n) 遍历 D kqueue 是 Linux 专用
# 3. Redis 6.0 的多线程 IO 如何工作(子线程只做 socket 读写与协议解析,命令执行仍单线程)?为什么命令执行阶段不多线程化? A 多线程 IO 负责命令执行 B 命令执行已多线程化 C IO 线程只做读写与解析,命令执行仍单线程 ✓ 正确答案 D 多线程 IO 会破坏命令原子性
# 4. Redis 事件驱动框架(aeEventLoop)如何统一处理文件事件(网络 IO)与时间事件(serverCron)?一次事件循环的处理流程是怎样的? A 文件事件与时间事件分开线程处理 B 事件循环用 epoll_wait 超时同时处理文件事件与时间事件 ✓ 正确答案 C serverCron 是网络事件 D 时间事件会阻塞命令执行
# 5. 单线程模型下 BLPOP/XREAD BLOCK 等阻塞命令如何实现(把客户端挂入阻塞列表、有数据推送时唤醒,而不占用事件循环)? A 阻塞命令会占用事件循环等待 B 阻塞客户端被挂入等待列表,数据就绪时唤醒,不占用事件循环 ✓ 正确答案 C BLPOP 实现靠自旋轮询 D 阻塞命令会影响其他客户端
# 6. Redis 后台持久化(bgsave/bgrewriteaof 的 fork + 写时复制)如何与主线程协作?fork 耗时与写放大对延迟有何影响? A COW 下主线程修改页面会复制该页,子进程看到快照 ✓ 正确答案 B fork 期间主线程完全空闲 C 写操作不会触发 COW 页复制 D fork 耗时与实例内存无关
# 7. Redis 单线程与 CPU 瓶颈的关系是什么?如何通过多实例部署充分利用多核? A 单线程能利用所有 CPU 核 B 多线程能解决 Redis 的 CPU 瓶颈 C 单实例达到单核上限时,可用多实例部署充分利用多核 ✓ 正确答案 D 单线程模型下 CPU 永远不会是瓶颈
# 8. Redis 7 在 IO 多线程上做了哪些改进(io-threads 动态启停)? A Redis 7 支持运行时动态调整 io-threads 数量 ✓ 正确答案 B Redis 7 只支持固定线程数 C Redis 7 命令执行也多线程化 D Redis 7 移除了多线程 IO
# 9. Redis 分布式锁的标准实现 SET key val NX PX + Lua 脚本解锁(先校验 val 再 DEL)是什么?为什么解锁必须原子、val 为什么要唯一? A 解锁可以先 GET 再 DEL,无需原子 B val 唯一用于防止误删他人持有的锁 ✓ 正确答案 C NX 保证锁永远不失效 D PX 设置锁的可重入次数
# 10. Redis 单线程下 Lua 脚本的原子性边界与集群模式的多 key(slot)限制 A Lua 脚本可跨节点原子执行 B 集群模式下脚本 key 必须同槽,原子性限于单节点 ✓ 正确答案 C Lua 脚本内 key 可任意分布在多个节点 D 单线程模型下 Lua 不保证原子
# 11. 单线程 Redis 的阻塞点盘点,慢命令、大 Key 删除、AOF fsync、内存淘汰与网络拥塞如何逐项治理? A KEYS 命令适合在线使用 B 大 Key 删除用 UNLINK 异步化避免阻塞 ✓ 正确答案 C AOF fsync 阻塞无法避免 D 网络拥塞无法治理
# 12. Redis Pipeline 的原理与收益,一次 RTT 批量发送命令如何提升吞吐?与事务、多路复用的关系? A Pipeline 保证命令原子执行 B Pipeline 会降低吞吐 C Pipeline 与事务作用完全相同 D Pipeline 通过批量发送减少 RTT 提升吞吐 ✓ 正确答案
# 13. Redis 事务 WATCH 的乐观锁语义,CAS 式检测与冲突重试的工程实现,与分布式锁的适用边界? A WATCH 是悲观锁 B 分布式锁无需处理死锁 C WATCH 提供 CAS 式检测,冲突时事务放弃需重试 ✓ 正确答案 D WATCH 会阻塞其他客户端
# 14. Redisson 可重入锁与公平锁的实现,为什么默认推荐可重入非公平锁?看门狗续期与故障转移风险? A 默认推荐公平锁因为性能更高 B 主从切换不会影响锁 C 看门狗无法解决锁过期问题 D 可重入锁支持同一线程重复加锁 ✓ 正确答案
# 15. 分布式锁的替代方案对比,数据库唯一约束、ZooKeeper 临时顺序节点与 Redis 锁各自的一致性保证与性能? A Redis 锁一致性最强 B Redis 锁主从切换不会丢锁 C 数据库唯一约束性能最高 D ZooKeeper 临时节点提供强一致且自动释放 ✓ 正确答案
# 16. 锁释放的原子性,为什么解锁必须用 Lua 比较删除?业务超时后锁被他人持有时的误删如何避免? A 解锁可以先 GET 再 DEL B 用 Lua 原子比较 val 后删除,避免误删他人锁 ✓ 正确答案 C 解锁不需要校验 val D 唯一 val 用于计数可重入
# 17. 锁续期(Redisson 看门狗 watchdog)如何解决业务执行时间超过锁过期时间的问题?续期线程异常或进程假死会带来什么风险? A 看门狗只在加锁时执行一次 B 进程假死不会影响锁 C 看门狗会增加锁过期时间不可控 D 看门狗周期性续期,续期线程异常可能导致锁提前释放 ✓ 正确答案
# 18. Redlock 争议的核心是什么(Kleppmann 指出时钟跳变与 GC/进程暂停会破坏安全性,antirez 的反驳)?哪些场景下 Redlock 仍可接受、哪些场景必须用 fencing? A Kleppmann 认为时钟与 GC 不会影响 Redlock 安全性 B 强一致场景必须用 fencing token 让资源端验证锁持有者 ✓ 正确答案 C Redlock 在多数派失败时仍能加锁 D antirez 认为 Redlock 完全无用
# 19. 为什么基于 Redis 主从异步复制的分布式锁在主从切换瞬间可能破坏互斥(锁尚未同步到从库即完成故障转移)?fencing token 单调递增编号如何兜底? A 主从切换不会丢锁 B fencing token 让资源端校验单调递增 token,拒绝过期锁持有者 ✓ 正确答案 C 异步复制下锁一定同步到从库 D fencing token 与锁无关
# 20. Redis 的慢查询(SLOWLOG)与延迟监控(LATENCY 事件)定位阻塞源 A LATENCY 事件用于监控内部延迟来源(如 fork、eviction) ✓ 正确答案 B SLOWLOG 记录系统级延迟事件 C SLOWLOG 不能定位慢命令 D LATENCY DOCTOR 用于查看慢命令