719 字
4 分钟
Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?本文
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

Redis 主节点返回写入成功,默认只说明它已经执行了该命令,不意味着所有副本已经接收、应用并持久化。若主节点随后故障,故障转移选中的副本没有这条修改,客户端收到成功响应的数据仍可能丢失。

三个保证不要混淆#

问题对应机制剩余风险
本节点重启能否恢复RDB/AOF快照间隔、刷盘与磁盘故障
副本是否追上本次写入复制进度与 WAIT副本持久化及选主条件
故障后能否恢复服务Sentinel/Cluster未复制写入和网络分区

例如 A 写入订单状态并返回成功,在 B 应用该修改前 A 宕机,B 被提升为主节点,就会缺少这次更新。即使 A 配置 AOF 每次刷盘,也不能自动让 B拥有 A 磁盘上的日志。持久化提高本节点恢复能力,复制提高其他节点接管能力,二者作用不同。

WAIT 到底等待什么?#

在同一客户端连接上完成写入后,WAIT 1 1000 请求最多等待 1000 毫秒,直到至少一个副本确认达到该连接之前写入对应的复制位置。返回值是实际确认的副本数量,可能低于目标;应用不能忽略返回值就宣称写入可靠。

WAIT 提高数据存在于多个节点的概率,但没有把 Redis 改成强一致性共识系统。确认不等同于副本磁盘刷盘,故障转移也不承诺一定选中已经确认的副本。Redis 7.2 引入的 WAITAOF 进一步涉及 AOF 同步确认,使用前仍需检查版本、持久化配置和其具体语义。

常见追问#

min-replicas-to-write 保证每次写入已复制吗?#

不保证。它限制主节点在健康副本数量与延迟条件不足时接受写入,属于降低风险的准入条件,不是逐条写入的同步提交协议。

WAIT 超时后能直接认为前面的 SET 失败吗?#

不能。SET 可能已在主节点执行,只是复制确认没有达到要求。超时后的重试要考虑幂等性和结果不确定性。

Redis 锁经过 WAIT 后绝对安全吗?#

仍不绝对安全。还存在租约过期、客户端暂停和资源端旧请求继续执行的问题。关键业务需要数据库约束或 fencing token 等资源端校验。

哪些数据不适合只依赖 Redis?#

支付结果、唯一订单账本等不能容忍丢失的核心事实,应采用符合业务可靠性要求的持久化存储;Redis 可以加速访问或协调,但业务正确性要有可恢复的依据。

Redis 主从切换为什么会丢数据?WAIT 能解决吗?
https://blog.xqcherry.top/posts/interview/redis/redis-replication-data-loss/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0