面试知识

Redis(远程字典服务)从基础到精通

12-Redis从基础到精通 面试知识整理。

Redis(远程字典服务)从基础到精通

正式分册入口与阅读顺序

先按“数据如何存取 → 请求如何执行 → 数据如何恢复与复制 → 集群如何高可用 → 缓存如何一致 → 锁如何兜底 → 场景如何落地 → 线上如何排障”的顺序阅读;每一册都可独立复习。

  1. 00-知识图谱与复习路线:建立知识边界、复习顺序和项目映射。
  2. 01-数据结构命令语义:掌握 String(字符串)、Hash(哈希)、List(列表接口)和 ZSet(有序集合)的选型及命令边界。
  3. 02-事件循环与网络模型:理解 I/O(输入输出)多路复用、命令执行与阻塞风险。
  4. 03-持久化与复制:理解 RDB(快照持久化)、AOF(追加日志)及主从复制的数据恢复边界。
  5. 04-主从哨兵与集群:学习哨兵故障转移、Redis Cluster(Redis 集群)分片和迁移;文件生成中也以此路径进入。
  6. 05-缓存一致性与缓存问题:处理 Cache Aside(旁路缓存)、穿透、击穿、雪崩与失效窗口。
  7. 06-分布式锁全景:掌握加锁、续期、释放、主从切换风险和数据库兜底。
  8. 07-延迟队列限流与项目案例:把 ZSet(有序集合)、限流与 WMS(仓储管理系统)/跨境物流任务落到业务链路。
  9. 08-线上排障与综合题库:用于慢查询、big key(大键)、hot key(热键)及故障复盘;文件生成中也以此路径进入。

1. 简历关联点

简历中多次出现 Redis(远程字典服务):底层数据结构、高可用架构、缓存穿透/击穿/雪崩、Lua(脚本语言)原子脚本、ZSet(有序集合)延迟队列、分布式锁、库存防超卖、支付回调幂等、异步任务重试。这个模块要能支撑下面几类追问:

  • Redis(远程字典服务)为什么快。
  • Redis(远程字典服务)单线程为什么还能高性能。
  • Redis(远程字典服务)持久化怎么保证恢复能力。
  • Redis(远程字典服务)主从、哨兵、集群分别解决什么问题。
  • Redis(远程字典服务)分布式锁怎么实现,为什么要 Lua(脚本语言)释放锁。
  • Redisson(Redis 客户端)看门狗如何续期。
  • RedLock(红锁)到底解决什么问题,又有什么争议。
  • 项目里如何用 Redis(远程字典服务)解决库存防超卖、延迟队列、报警风暴治理。

2. 面试主线

回答 Redis(远程字典服务)问题时,建议从“快 -> 稳 -> 高可用 -> 一致性 -> 项目落地”展开。

  1. Redis(远程字典服务)快,核心原因是内存存储、单线程命令执行、I/O(输入输出)多路复用、高效数据结构。
  2. Redis(远程字典服务)稳,依赖过期删除、内存淘汰、RDB(快照持久化)、AOF(追加日志)、慢查询和大 key(键)治理。
  3. Redis(远程字典服务)高可用,单机解决不了故障,主从解决读扩展,哨兵解决自动故障转移,集群解决容量和分片。
  4. Redis(远程字典服务)锁要讲清加锁、解锁、过期、续期、误删、主从切换、脑裂。
  5. 项目落地要讲清为什么选择 Redis(远程字典服务)、风险是什么、兜底在哪里。

3. 基础知识

3.1 Redis(远程字典服务)为什么快

原因说明
内存存储数据主要在内存,避免磁盘随机 I/O(输入输出)
单线程命令执行避免多线程锁竞争和上下文切换
I/O(输入输出)多路复用一个线程可处理大量连接事件
高效数据结构SDS(简单动态字符串)、dict(哈希字典)、skiplist(跳表)、quicklist(快速列表)
简单协议RESP(Redis 序列化协议)解析成本低

Redis(远程字典服务)“单线程”主要指命令执行线程是单线程。现代 Redis(远程字典服务)在网络 I/O(输入输出)、持久化、异步释放等方面可能使用后台线程,但命令执行仍保持串行语义,避免并发写同一数据结构的复杂锁。

热门面试题

  1. 问题(基础题):3.1 Redis(远程字典服务)为什么快 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 3.1 Redis(远程字典服务)为什么快,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):3.1 Redis(远程字典服务)为什么快 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):WMS(仓储管理系统)商品查询高峰时,怎样既利用 Redis(远程字典服务)的低延迟,又避免缓存不可用把 MySQL(关系型数据库)打垮?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:热点商品走 Redis(远程字典服务)缓存,未命中时用请求合并控制回源并设置随机过期时间;检测到连接超时、命中率骤降或 MySQL(关系型数据库)连接池耗尽时,立即限流、降级为旧值或静态兜底,并监控命中率、慢命令和回源 QPS(每秒查询率)。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

3.2 常用数据类型和底层结构

类型常见用途典型底层结构
String(字符串)缓存、计数、分布式锁SDS(简单动态字符串)
Hash(哈希)对象字段缓存listpack(紧凑列表)、dict(哈希字典)
List(列表接口)简单队列quicklist(快速列表)
Set(集合接口)去重、标签intset(整数集合)、dict(哈希字典)
ZSet(有序集合)排行榜、延迟队列listpack(紧凑列表)、skiplist(跳表)+ dict(哈希字典)
Bitmap(位图)签到、状态标记String(字符串)位操作
HyperLogLog(基数统计)UV(独立访客数)估算概率统计结构
Stream(流)消息流radix tree(基数树)

热门面试题

  1. 问题(基础题):3.2 常用数据类型和底层结构 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 3.2 常用数据类型和底层结构,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):3.2 常用数据类型和底层结构 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):跨境物流的运单状态、去重标记和超时任务分别应选什么 Redis(远程字典服务)类型,选错会怎样?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:运单状态字段用 Hash(哈希)避免整对象反复序列化,回调去重用带过期时间的 String(字符串),到期任务用 ZSet(有序集合)的 score(分数)排序;监控编码膨胀和单键大小,超过阈值按运单或日期拆分,不能把可分页任务列表长期堆进一个 List(列表接口)。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

3.3 单线程模型与 I/O(输入输出)多路复用

flowchart TD
    A["客户端连接"] --> B["Socket(套接字)"]
    B --> C["Epoll(事件轮询机制)/Selector(选择器)"]
    C --> D["事件分发器"]
    D --> E["命令读取"]
    E --> F["命令解析"]
    F --> G["单线程执行命令"]
    G --> H["写回响应"]

单线程好处:

  • 数据结构操作串行,避免加锁。
  • 实现简单,延迟稳定。
  • CPU(中央处理器)多数时候不是瓶颈,网络和内存更关键。

单线程风险:

  • 大 key(键)删除会阻塞。
  • 慢命令会阻塞其他请求。
  • Lua(脚本语言)脚本执行太久会阻塞。
  • keys * 这类全量扫描会阻塞。

热门面试题

  1. 问题(基础题):3.3 单线程模型与 I/O(输入输出)多路复用 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 3.3 单线程模型与 I/O(输入输出)多路复用,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):3.3 单线程模型与 I/O(输入输出)多路复用 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):Runner(执行器)短时间上报大量任务状态时,怎样避免一个 Redis(远程字典服务)慢命令拖慢所有客户端?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:上报数据按任务分片并限制单批大小,禁止 KEYS(全量键扫描)和同步删除大 key(键);通过 slowlog(慢日志)、命令耗时分位数和事件循环延迟识别阻塞,先熔断非关键查询,再把大键改为异步释放或分批扫描。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

4. 底层原理

4.1 过期删除

Redis(远程字典服务)过期删除不是每个 key(键)到期立即删除,而是组合策略:

策略说明优缺点
惰性删除访问 key(键)时发现过期再删除节省 CPU(中央处理器),但可能占内存
定期删除周期性抽样检查过期 key(键)平衡 CPU(中央处理器)和内存
内存淘汰内存达到上限时按策略淘汰防止内存打满

常见淘汰策略:

策略含义适合场景
noeviction(不淘汰)写入直接报错强一致缓存或不能丢数据
allkeys-lru(全键最近最少使用)所有 key(键)按 LRU(最近最少使用)淘汰通用缓存
volatile-lru(过期键最近最少使用)只淘汰设置过期时间的 key(键)缓存与持久 key(键)混用
allkeys-lfu(全键最不常用)所有 key(键)按 LFU(最不常用)淘汰热点明显场景
volatile-ttl(过期键最短生存时间)优先淘汰快过期 key(键)对过期时间敏感

热门面试题

  1. 问题(基础题):4.1 过期删除 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 4.1 过期删除,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):4.1 过期删除 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):库存缓存的 key(键)过期如何设计,才能避免批量失效后同时回源?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:为不同 SKU(库存单位)设置基础过期时间加随机抖动,热点库存使用逻辑过期并由后台单飞重建;内存逼近上限时优先阻止非核心缓存写入,监控过期键比例、淘汰次数和数据库回源量,不能把库存扣减正确性建立在缓存必然存在的假设上。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

4.2 RDB(快照持久化)

RDB(快照持久化)是在某个时间点生成数据快照,适合备份和快速恢复。

flowchart LR
    A["触发 RDB(快照持久化)"] --> B["fork(派生)子进程"]
    B --> C["父进程继续处理请求"]
    B --> D["子进程写临时 RDB(快照持久化)文件"]
    D --> E["写完后替换旧文件"]

RDB(快照持久化)优点是恢复快、文件紧凑;缺点是两次快照之间的数据可能丢失。

热门面试题

  1. 问题(基础题):4.2 RDB(快照持久化) 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 4.2 RDB(快照持久化),再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):4.2 RDB(快照持久化) 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):Redis(远程字典服务)发生主机故障后,RDB(快照持久化)如何用于恢复,哪些业务数据不能只依赖它?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:RDB(快照持久化)用于快速装载最近快照并缩短恢复时间,但快照间隔内的写入会丢失;库存、支付和任务完成态仍以 MySQL(关系型数据库)事务流水为准,恢复后通过消息重放或对账补齐缓存,并演练快照校验、实例拉起和流量逐步回切。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

4.3 AOF(追加日志)

AOF(追加日志)记录写命令,恢复时重放命令。

flowchart TD
    A["写命令执行成功"] --> B["追加到 AOF(追加日志)缓冲区"]
    B --> C{"appendfsync(追加刷盘策略)"}
    C -->|always(每次刷盘)| D["最安全,性能最低"]
    C -->|everysec(每秒刷盘)| E["折中,最多丢 1 秒"]
    C -->|no(系统决定)| F["性能好,风险高"]
    E --> G["AOF rewrite(追加日志重写)压缩文件"]

热门面试题

  1. 问题(基础题):4.3 AOF(追加日志) 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 4.3 AOF(追加日志),再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):4.3 AOF(追加日志) 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):支付回调幂等标记使用 AOF(追加日志)时,怎样平衡丢失窗口与写入延迟?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:通常采用每秒刷盘,把至多一秒的数据窗口明确为可接受风险;AOF(追加日志)只加速重复回调的快速拦截,最终仍由 MySQL(关系型数据库)唯一流水号和状态机保证幂等。监控刷盘延迟、重写耗时和文件增长,重写期间预留磁盘与 Copy-on-Write(写时复制)内存余量。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

4.4 主从复制

Redis(远程字典服务)主从复制流程:

sequenceDiagram
    participant S as Slave(从节点)
    participant M as Master(主节点)
    S->>M: PSYNC(部分同步)请求
    M->>M: 生成 RDB(快照持久化)
    M->>S: 发送 RDB(快照持久化)文件
    M->>S: 发送复制缓冲区增量命令
    S->>S: 加载 RDB(快照持久化)并重放增量命令
    M-->>S: 后续持续命令复制

复制是异步的,因此主节点写成功不代表从节点已经同步。这一点会影响 Redis(远程字典服务)分布式锁在主从切换时的安全性。

热门面试题

  1. 问题(基础题):4.4 主从复制 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 4.4 主从复制,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):4.4 主从复制 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):跨境物流读多写少时,如何使用主从复制扩展读能力,又不把旧从库数据用于关键决策?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:轨迹展示和非关键查询可读 Replica(从节点),下单、扣减库存、支付状态确认始终读 Master(主节点)或 MySQL(关系型数据库);持续监控复制偏移量和延迟,超过阈值时摘除从库读流量,切换后由数据库状态与幂等流水校正 Redis(远程字典服务)缓存。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

5. 架构图与流程图

5.1 哨兵架构

flowchart TD
    C["客户端"] --> S1["Sentinel(哨兵)1"]
    C --> S2["Sentinel(哨兵)2"]
    C --> S3["Sentinel(哨兵)3"]
    S1 --> M["Master(主节点)"]
    S2 --> M
    S3 --> M
    M --> R1["Replica(从节点)1"]
    M --> R2["Replica(从节点)2"]
    S1 -.监控.-> R1
    S2 -.监控.-> R2

哨兵解决:

  • 监控主从节点是否存活。
  • 主节点故障时选举新主节点。
  • 通知客户端新主节点地址。

哨兵不解决:

  • 单主容量上限。
  • 分片扩容。
  • 强一致复制。

热门面试题

  1. 问题(基础题):5.1 哨兵架构 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 5.1 哨兵架构,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):5.1 哨兵架构 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):WMS(仓储管理系统)使用哨兵时主节点切换,客户端和业务侧各要做什么兜底?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:客户端通过哨兵发现新主节点并开启有限重试,切换窗口内把非核心读降级;库存冻结和支付状态变更必须落 MySQL(关系型数据库)事务与幂等流水,不能因 Redis(远程字典服务)短暂不可用而直接重放扣减。告警关注主观下线、客观下线、选主耗时和复制延迟。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

5.2 集群架构

flowchart TD
    C["客户端"] --> A["Master A\nslot(槽)0-5460"]
    C --> B["Master B\nslot(槽)5461-10922"]
    C --> D["Master C\nslot(槽)10923-16383"]
    A --> A1["Replica A1(从节点)"]
    B --> B1["Replica B1(从节点)"]
    D --> D1["Replica C1(从节点)"]
    A -.gossip(流言协议).-> B
    B -.gossip(流言协议).-> D
    D -.gossip(流言协议).-> A

Redis Cluster(Redis 集群)通过 16384 个 slot(槽)分片。key(键)经过 CRC16(循环冗余校验)计算后映射到 slot(槽),slot(槽)再归属到某个主节点。

热门面试题

  1. 问题(基础题):5.2 集群架构 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 5.2 集群架构,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):5.2 集群架构 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):跨境物流按运单号分片后,怎样设计 key(键)并处理扩容迁槽期间的请求?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:以运单号作为稳定散列因子,确有原子多键需求时才使用花括号标签;客户端必须识别 MOVED(迁移中标记)和 ASK(临时重定向)并刷新槽位映射。迁槽前评估热点,迁槽中限速并观察命中率、重定向量和节点内存,失败时暂停迁移而不让业务自行写双份数据。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

5.3 缓存问题治理

flowchart TD
    A["请求进入"] --> B{"Redis(远程字典服务)命中?"}
    B -->|命中| C["返回缓存"]
    B -->|未命中| D{"是否非法 key(键)?"}
    D -->|是| E["布隆过滤器/空值缓存\n防穿透"]
    D -->|否| F{"是否热点 key(键)过期?"}
    F -->|是| G["互斥锁/逻辑过期\n防击穿"]
    F -->|否| H["查询 MySQL(关系型数据库)并回填"]
    H --> I["随机过期时间\n防雪崩"]

热门面试题

  1. 问题(基础题):5.3 缓存问题治理 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 5.3 缓存问题治理,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):5.3 缓存问题治理 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):商品详情接口如何分别处理恶意不存在 ID(标识)、爆款过期和 Redis(远程字典服务)故障?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:不存在 ID(标识)先过参数校验和 Bloom Filter(布隆过滤器),确实不存在时缓存空值;爆款用逻辑过期和单飞重建避免并发回源;Redis(远程字典服务)故障时按接口等级返回本地旧值、限流或降级页。用穿透率、回源 QPS(每秒查询率)、重建锁等待和缓存错误率驱动告警。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

6. 表格对比

6.1 主从、哨兵、集群

架构解决问题优点缺点
单机简单缓存成本低、简单单点故障、容量有限
主从读扩展、备份读写分离、从库备份主节点故障需人工切换
哨兵自动故障转移高可用、自动选主不解决分片容量
集群水平扩容分片、容量高跨 slot(槽)操作受限、运维复杂

热门面试题

  1. 问题(基础题):6.1 主从、哨兵、集群 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 6.1 主从、哨兵、集群,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):6.1 主从、哨兵、集群 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):从单机迁到 Redis(远程字典服务)集群时,如何为库存缓存选择架构并制定回退方案?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:容量和吞吐超过单主上限时选择 Redis Cluster(Redis 集群),只需自动主从切换时选择哨兵;迁移前双读校验、灰度写入并记录迁移进度,回退时保留旧集群只读窗口。库存真相仍来自 MySQL(关系型数据库),所以缓存迁移失败只降级查询,不允许绕过数据库扣减条件。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

6.2 Redis(远程字典服务)锁方案对比

方案能力风险适合场景
JVM(Java 虚拟机)本地锁单进程互斥多实例无效单体应用、本地内存状态
SET NX PX(不存在才设置并带过期时间)原子加锁并设置过期业务超时导致锁过期简单分布式互斥
Lua(脚本语言)解锁校验 owner(持有者)后删除脚本过长会阻塞防止误删他人锁
Redisson(Redis 客户端)可重入、看门狗续期依赖客户端和 Redis(远程字典服务)稳定性Java(编程语言)项目常用
RedLock(红锁)多主节点多数派加锁复杂、有争议、依赖时钟和网络极高容错需求但需谨慎评估
Zookeeper(分布式协调服务)锁临时顺序节点性能低于 Redis(远程字典服务)强协调、顺序公平

热门面试题

  1. 问题(基础题):6.2 Redis(远程字典服务)锁方案对比 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 6.2 Redis(远程字典服务)锁方案对比,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):6.2 Redis(远程字典服务)锁方案对比 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):库存扣减为何不能把 Redisson(Redis 客户端)锁当成最终正确性保障?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:Redisson(Redis 客户端)锁只缩小并发临界区,主从切换、进程停顿和网络分区仍可能造成并发执行;扣减 SQL(结构化查询语言)必须带 stock >= quantity 条件并写库存流水,订单号设唯一约束。监控锁等待、续期失败、扣减行数和补偿任务积压,发现异常时冻结该 SKU(库存单位)的写入而不是盲目重试。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

7. 数据演绎

7.1 SET NX PX(不存在才设置并带过期时间)锁演绎

正确加锁:

SET lock:order:1001 requestId-abc NX PX 30000

含义:

  • lock:order:1001 是锁 key(键)。
  • requestId-abc 是唯一 owner(持有者)标识。
  • NX(不存在才设置)保证只有一个线程加锁成功。
  • PX(毫秒过期时间)保证客户端宕机后锁最终释放。

错误解锁:

DEL lock:order:1001

如果线程 A 锁过期后线程 B 已重新加锁,线程 A 再执行 DEL(删除)会误删线程 B 的锁。

正确解锁必须用 Lua(脚本语言)保证“判断 owner(持有者)+ 删除”原子执行:

if redis.call('get', KEYS[1]) == ARGV[1] then
  return redis.call('del', KEYS[1])
else
  return 0
end

时序图:

sequenceDiagram
    participant A as 服务A
    participant R as Redis(远程字典服务)
    participant B as 服务B
    A->>R: SET lock NX PX 30000 成功
    A->>A: 执行业务超过 30 秒
    R-->>R: 锁自动过期
    B->>R: SET lock NX PX 30000 成功
    A->>R: Lua(脚本语言)校验 owner(持有者)
    R-->>A: owner(持有者)不匹配,不删除

热门面试题

  1. 问题(基础题):7.1 SET NX PX(不存在才设置并带过期时间)锁演绎 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 7.1 SET NX PX(不存在才设置并带过期时间)锁演绎,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):7.1 SET NX PX(不存在才设置并带过期时间)锁演绎 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):库存冻结使用 SET NX PX(不存在才设置并带过期时间)时,锁过期和服务停顿如何避免超卖?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:锁值使用唯一 requestId(请求标识),释放时由 Lua(脚本语言)校验后删除;锁只减小竞争,最终扣减仍执行带版本号或库存条件的 MySQL(关系型数据库)更新并写流水。记录加锁失败、锁等待、锁超时和扣减失败原因,超时后由可重入的补偿任务核对冻结与订单状态。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

7.2 Redisson(Redis 客户端)看门狗

Redisson(Redis 客户端)默认锁过期时间通常是 30 秒。如果业务没执行完,看门狗会定期续期。

flowchart TD
    A["线程加锁成功"] --> B["设置过期时间 30 秒"]
    B --> C["启动 watchdog(看门狗)"]
    C --> D{"业务是否完成?"}
    D -->|否| E["定期续期"]
    E --> D
    D -->|是| F["Lua(脚本语言)校验并解锁"]
    C --> G{"客户端是否宕机?"}
    G -->|是| H["无人续期,锁自然过期"]

看门狗解决了“业务执行时间超过锁过期时间”的问题,但不能解决所有问题:

  • Redis(远程字典服务)主从异步复制丢锁。
  • 网络分区导致客户端误判。
  • 锁内业务没有幂等,重试仍可能出错。

热门面试题

  1. 问题(基础题):7.2 Redisson(Redis 客户端)看门狗 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 7.2 Redisson(Redis 客户端)看门狗,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):7.2 Redisson(Redis 客户端)看门狗 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):批量创建出库单超过 30 秒时,Redisson(Redis 客户端)看门狗如何使用,什么情况下仍应主动拆分任务?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:无显式租约时看门狗在持锁线程存活期间周期续期,业务完成后按所有者标识释放;长事务仍需拆成可重试的库存冻结、出库单写入和异步通知,避免锁内调用第三方。监控续期异常、持锁时长和线程池饱和,应用失联后让锁自然到期并由 MySQL(关系型数据库)状态机决定是否补偿。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

7.3 主从切换导致锁丢失

时间事件结果
T1服务 A 在 Master(主节点)加锁成功Master(主节点)存在锁
T2锁还没复制到 Replica(从节点)Replica(从节点)没有锁
T3Master(主节点)宕机哨兵触发切换
T4Replica(从节点)升为新 Master(主节点)新 Master(主节点)没有锁
T5服务 B 加锁成功A 和 B 可能同时执行业务

结论:Redis(远程字典服务)锁默认偏 AP(可用性和分区容错),不能当作绝对强一致锁。资金扣费、库存扣减必须有 MySQL(关系型数据库)唯一索引、乐观锁、幂等流水兜底。

热门面试题

  1. 问题(基础题):7.3 主从切换导致锁丢失 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 7.3 主从切换导致锁丢失,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):7.3 主从切换导致锁丢失 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):哨兵切换恰好发生在库存锁写入后,怎样证明系统不会因为锁丢失而重复扣减?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:承认 Redis(远程字典服务)异步复制不能证明互斥绝对成立;扣减必须依赖 MySQL(关系型数据库)UPDATE(更新)条件、订单唯一键和库存流水的事务原子性。监控角色切换、复制延迟和扣减冲突,故障窗口内只把 Redis(远程字典服务)视为限流与削峰设施,冲突订单进入对账补偿而不是再次直接扣库。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

7.4 ZSet(有序集合)延迟队列

ZSet(有序集合)延迟队列把执行时间作为 score(分数),任务 ID(标识)作为 member(成员)。

ZADD queue:delay 1710000000000 task-1001

消费逻辑:

  1. 查询 score(分数)小于当前时间的任务。
  2. 用 Lua(脚本语言)或分布式锁抢占任务。
  3. 成功后删除 ZSet(有序集合)成员。
  4. 执行业务,失败后按重试次数重新写入未来时间。
flowchart LR
    A["ZSet(有序集合)延迟队列"] --> B["按 score(分数)取到期任务"]
    B --> C["Lua(脚本语言)原子抢占"]
    C --> D["执行业务"]
    D -->|成功| E["记录完成"]
    D -->|失败| F["增加 retry(重试次数)并延迟重投"]

热门面试题

  1. 问题(基础题):7.4 ZSet(有序集合)延迟队列 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 7.4 ZSet(有序集合)延迟队列,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):7.4 ZSet(有序集合)延迟队列 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):跨境物流面单拉取任务用 ZSet(有序集合)延迟队列时,如何防止多消费者重复执行和任务永久丢失?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:消费者用 Lua(脚本语言)把到期 member(成员)从待执行集合原子转入处理中集合,再按任务 ID(标识)写 MySQL(关系型数据库)幂等记录;成功确认,失败按指数退避重投,处理超时则扫描回收。持续监控到期积压、处理中超时、重试次数和死信数量,服务重启后由持久化任务表补扫。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

8. 线上排查与实战经验

8.1 Redis(远程字典服务)慢查询

排查方向:

  • slowlog(慢日志)查看慢命令。
  • bigkeys(大键扫描)定位大 key(键)。
  • 查看 CPU(中央处理器)、内存、网络带宽。
  • 检查是否有 keys(全量键扫描)、hgetall(全量哈希读取)、smembers(全量集合读取)。
  • 检查 Lua(脚本语言)脚本是否执行太久。

治理方式:

  • 大 key(键)拆分。
  • 使用 scan(渐进扫描)代替 keys(全量键扫描)。
  • 删除大 key(键)使用异步删除。
  • 热点 key(键)本地缓存或多级缓存。
  • 对高风险命令加审计。

热门面试题

  1. 问题(基础题):8.1 Redis(远程字典服务)慢查询 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 8.1 Redis(远程字典服务)慢查询,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):8.1 Redis(远程字典服务)慢查询 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):IoT(物联网)报警风暴期间 Redis(远程字典服务)响应变慢,如何在十分钟内定位并止血?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:先查看 slowlog(慢日志)、命令耗时和事件循环延迟,结合 MEMORY USAGE(内存占用查询)与 bigkeys(大键扫描)确认是否为大 key(键)、全量命令或 Lua(脚本语言)阻塞;立即限流报警聚合、停用高风险命令并把大键改为异步删除,随后拆分告警集合和补齐命令白名单。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

8.2 缓存穿透、击穿、雪崩

问题现象方案
缓存穿透请求不存在数据,直接打到 MySQL(关系型数据库)布隆过滤器、空值缓存、参数校验
缓存击穿热点 key(键)过期,大量请求打到 MySQL(关系型数据库)互斥锁、逻辑过期、热点预热
缓存雪崩大量 key(键)同时过期或 Redis(远程字典服务)故障过期时间随机化、多级缓存、限流降级

热门面试题

  1. 问题(基础题):8.2 缓存穿透、击穿、雪崩 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 8.2 缓存穿透、击穿、雪崩,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):8.2 缓存穿透、击穿、雪崩 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):大促前商品缓存同时过期的风险怎样演练,故障时怎样保护 MySQL(关系型数据库)?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:预热核心商品并在 TTL(存活时间)上加入随机散列,热点值采用逻辑过期加单飞刷新;压测模拟缓存全失效后检查限流、熔断和本地旧值是否生效。回源必须有并发上限与数据库连接池保护,观察缓存命中率、回源 QPS(每秒查询率)、拒绝量和 MySQL(关系型数据库)慢 SQL(结构化查询语言)。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

8.3 分布式锁排查

当出现重复执行、超扣、任务重复消费时,排查:

  1. 锁 key(键)粒度是否过粗或过细。
  2. owner(持有者)是否唯一。
  3. 加锁和设置过期是否一个原子命令。
  4. 解锁是否使用 Lua(脚本语言)校验 owner(持有者)。
  5. 业务耗时是否超过锁过期时间。
  6. Redisson(Redis 客户端)看门狗是否启用。
  7. Redis(远程字典服务)是否发生主从切换。
  8. 业务是否有 MySQL(关系型数据库)唯一索引、状态机、幂等流水兜底。

热门面试题

  1. 问题(基础题):8.3 分布式锁排查 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 8.3 分布式锁排查,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):8.3 分布式锁排查 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):发现同一支付流水被处理两次时,怎样区分锁实现缺陷与业务幂等缺陷?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:按请求 ID(标识)串起加锁结果、锁值、持锁时长、续期和解锁脚本日志,再核对主从切换与网络超时;同时检查 MySQL(关系型数据库)唯一索引、状态机条件更新和回调幂等记录。即使确认锁失效,也以数据库冲突是否被正确拒绝为最终判定,并为异常流水执行可审计补偿。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

9. 项目落地话术

9.1 库存防超卖话术

“库存防超卖不能只靠 Redis(远程字典服务)锁。我的设计会分三层:第一层用 Redis(远程字典服务)Lua(脚本语言)保证批量 SKU(库存单位)冻结原子性;第二层用 MySQL(关系型数据库)乐观锁和库存流水保证最终可追溯;第三层用幂等键防止重复冻结和重复回滚。Redis(远程字典服务)负责抗高并发,MySQL(关系型数据库)负责最终正确性。”

热门面试题

  1. 问题(基础题):9.1 库存防超卖话术 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 9.1 库存防超卖话术,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):9.1 库存防超卖话术 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):一次订单包含多个 SKU(库存单位)时,如何保证冻结、扣减、取消回滚都可追溯且不会超卖?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:Redis(远程字典服务)Lua(脚本语言)只负责多 SKU(库存单位)预扣的原子校验和削峰,MySQL(关系型数据库)在事务内按商品维度做条件扣减并写冻结流水;订单号、动作类型和库存版本组成幂等键。取消或超时释放走同一流水反向操作,定期比对 Redis(远程字典服务)预扣、数据库冻结和可售库存。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

9.2 支付回调幂等话术

“支付回调可能重复、乱序、丢失,所以我不会只用 Redis(远程字典服务)锁。我会用唯一流水号做 MySQL(关系型数据库)唯一约束,用 Redis(远程字典服务)锁降低并发冲突,再用状态机控制只允许从待支付流转到已支付。即使 Redis(远程字典服务)锁失效,数据库唯一约束和状态机也能兜底。”

热门面试题

  1. 问题(基础题):9.2 支付回调幂等话术 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 9.2 支付回调幂等话术,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):9.2 支付回调幂等话术 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):支付渠道连续重复回调且乱序时,Redis(远程字典服务)怎样与 MySQL(关系型数据库)共同保证一次入账?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:用支付流水号作为 Redis(远程字典服务)短锁和数据库唯一键,先校验签名与订单金额,再以状态机条件更新入账;重复回调读取已完成结果,乱序回调拒绝非法状态迁移。缓存失效不影响数据库唯一约束,失败回调进入可重试任务并以渠道主动查单和对账结果收敛。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

9.3 ZSet(有序集合)延迟队列话术

“我在订单履约、面单拉取、轨迹推送里用过 Redis(远程字典服务)ZSet(有序集合)实现延迟队列。score(分数)放下次执行时间,member(成员)放任务 ID(标识)。消费者只取到期任务,通过 Lua(脚本语言)抢占,成功后执行业务。失败就按重试次数做阶梯延迟,超过最大次数进入异常状态,避免无限重试风暴。”

热门面试题

  1. 问题(基础题):9.3 ZSet(有序集合)延迟队列话术 这一节在 Redis(远程字典服务) 面试中主要解决什么问题?

    • 考点:概念边界、核心作用、适用场景。
    • 回答思路:先用一句话定义 9.3 ZSet(有序集合)延迟队列话术,再说明它在系统稳定性、性能或一致性中的作用,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说一个使用场景。
    • 进阶追问:如果这个机制使用不当,线上最容易出现什么故障?如何监控和止血?
  2. 问题(原理题):9.3 ZSet(有序集合)延迟队列话术 底层是怎么工作的?请按执行流程讲一遍。

    • 考点:底层数据结构、状态流转、关键线程或组件、性能成本。
    • 回答思路:按“触发条件 -> 核心流程 -> 关键数据结构 -> 成功/失败分支 -> 资源释放或回滚”来讲,避免只背结论。
    • 进阶追问:如果并发量、数据量或故障率扩大 10 倍,这个流程里哪个环节会先成为瓶颈?
  3. 问题(项目追问题):Runner(执行器)调度重试任务时,怎样用 ZSet(有序集合)避免重试风暴并保留人工介入出口?

    • 考点:工程落地、异常场景、幂等、补偿、可观测性。
    • 回答思路:score(分数)存下一次执行时间,重试采用指数退避并加入随机抖动;Lua(脚本语言)抢占后以任务 ID(标识)写入处理中状态,超过最大次数转入死信表并告警。按业务类型隔离队列和并发配额,监控积压、失败率、处理时长和死信增长,由人工确认后再投递。
    • 进阶追问:如果服务重启、网络抖动或第三方接口超时,如何保证数据不丢、不重、不乱?

10. 高频面试题与追问

10.1 Redis(远程字典服务)为什么单线程还快?

因为 Redis(远程字典服务)主要在内存操作,命令执行很快;单线程避免锁竞争;I/O(输入输出)多路复用让单线程处理大量连接;数据结构高度优化。瓶颈通常是网络、大 key(键)、慢命令,而不是线程数。

10.2 Redis(远程字典服务)分布式锁为什么要设置过期时间?

如果客户端加锁后宕机,没有过期时间锁会永远不释放。PX(毫秒过期时间)是故障释放兜底,但过期时间太短会导致业务没执行完锁先释放,所以要结合 Redisson(Redis 客户端)看门狗或合理估算业务耗时。

10.3 为什么解锁要用 Lua(脚本语言)?

因为解锁需要“先判断 owner(持有者),再删除 key(键)”。如果分成 GET(获取)和 DEL(删除)两个命令,中间可能被其他线程加锁,导致误删。Lua(脚本语言)在 Redis(远程字典服务)中原子执行,可以避免这个问题。

10.4 RedLock(红锁)安全吗?

RedLock(红锁)通过多个独立 Redis(远程字典服务)主节点多数派加锁,提高单点故障下的安全性。但它依赖网络、时钟和超时假设,实现复杂,也有争议。实际业务里,如果是资金和库存,我更倾向于 Redis(远程字典服务)锁做并发控制,MySQL(关系型数据库)唯一约束、乐观锁、事务流水做最终兜底。

10.5 Redis(远程字典服务)集群下多 key(键)操作有什么限制?

Redis Cluster(Redis 集群)按 slot(槽)分片,多 key(键)操作要求 key(键)在同一个 slot(槽)。可以使用花括号标签让相关 key(键)落到同一 slot(槽),但要注意热点集中。

模块综合热门面试题补强

10.6 Redis(远程字典服务)为什么单线程还能高性能?

  • 问题:Redis(远程字典服务)为什么单线程还能高性能?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.7 SDS(简单动态字符串)相比 C(编程语言)字符串有什么优势?

  • 问题:SDS(简单动态字符串)相比 C(编程语言)字符串有什么优势?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.8 dict(哈希字典)如何渐进式 rehash(重新哈希)?

  • 问题:dict(哈希字典)如何渐进式 rehash(重新哈希)?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.9 skiplist(跳表)为什么适合 ZSet(有序集合)?

  • 问题:skiplist(跳表)为什么适合 ZSet(有序集合)?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.10 RDB(快照持久化)和 AOF(追加日志)怎么取舍?

  • 问题:RDB(快照持久化)和 AOF(追加日志)怎么取舍?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.11 AOF(追加日志)重写会不会阻塞主线程?

  • 问题:AOF(追加日志)重写会不会阻塞主线程?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.12 主从复制为什么可能丢锁?

  • 问题:主从复制为什么可能丢锁?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.13 哨兵主观下线和客观下线有什么区别?

  • 问题:哨兵主观下线和客观下线有什么区别?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.14 Redis Cluster(Redis 集群)MOVED(迁移中标记)和 ASK(临时重定向)有什么区别?

  • 问题:Redis Cluster(Redis 集群)MOVED(迁移中标记)和 ASK(临时重定向)有什么区别?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.15 缓存穿透、击穿、雪崩分别怎么治理?

  • 问题:缓存穿透、击穿、雪崩分别怎么治理?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.16 Cache Aside(旁路缓存)如何保证最终一致性?

  • 问题:Cache Aside(旁路缓存)如何保证最终一致性?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.17 延迟双删有什么问题?

  • 问题:延迟双删有什么问题?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.18 Redis(远程字典服务)事务为什么不支持回滚?

  • 问题:Redis(远程字典服务)事务为什么不支持回滚?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.19 Pipeline(管道)和事务有什么区别?

  • 问题:Pipeline(管道)和事务有什么区别?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.20 Stream(流)和 ZSet(有序集合)延迟队列怎么选?

  • 问题:Stream(流)和 ZSet(有序集合)延迟队列怎么选?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.21 Redisson(Redis 客户端)看门狗如何续期?

  • 问题:Redisson(Redis 客户端)看门狗如何续期?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.22 RedLock(红锁)的安全假设是什么?

  • 问题:RedLock(红锁)的安全假设是什么?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.23 big key(大键)如何排查和拆分?

  • 问题:big key(大键)如何排查和拆分?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.24 hot key(热键)如何治理?

  • 问题:hot key(热键)如何治理?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

10.25 Redis(远程字典服务)锁如何与 MySQL(关系型数据库)幂等兜底?

  • 问题:Redis(远程字典服务)锁如何与 MySQL(关系型数据库)幂等兜底?
  • 考点:核心概念、底层机制、失败边界、项目落地。
  • 回答思路:先给结论,再讲工作流程和关键取舍,最后结合 库存防超卖、支付回调幂等、ZSet(有序集合)延迟队列 说明线上怎么兜底。
  • 进阶追问:如果出现并发冲突、数据不一致、性能下降或服务重启,你如何定位、恢复和复盘?

11. 本模块复习清单

  • 能解释 Redis(远程字典服务)为什么快。
  • 能说清 Redis(远程字典服务)单线程模型和 I/O(输入输出)多路复用。
  • 能对比 String(字符串)、Hash(哈希)、List(列表接口)、Set(集合接口)、ZSet(有序集合)。
  • 能讲 RDB(快照持久化)和 AOF(追加日志)的优缺点。
  • 能画出主从复制、哨兵、集群架构。
  • 能说明缓存穿透、击穿、雪崩及治理。
  • 能完整讲 Redis(远程字典服务)分布式锁:SET NX PX(不存在才设置并带过期时间)、Lua(脚本语言)解锁、Redisson(Redis 客户端)看门狗、RedLock(红锁)。
  • 能说明 Redis(远程字典服务)锁在主从切换时的风险。
  • 能把 Redis(远程字典服务)锁、MySQL(关系型数据库)乐观锁、幂等流水组合成库存和支付方案。