Redis宕机数据会丢失么?
# 回答话术
先说结论,如果我们没开启任何持久化机制,那么会丢失全部数据,否则只会丢失部分数据,丢失数据的多少取决于持久化配置。
Redis 提供了两套持久化机制,一个是 RDB,它会根据情况定期的 fork 出一个子进程,生成当前数据库的全量快照;另一个是 AOF,它通过向 AOF 日志文件追加每一条执行过的指令实现。
而对于 RDB 快照,假如我们在 RDB 快照生成后宕机,那么会丢失快照生成期间全部增量数据,如果在连快照都没成功生成,那么就会丢掉全部数据。
而当我们仅开启了 AOF 时,丢失数据的多少取决于我们设置的刷盘策略:当设置为每条指令执行后都刷盘 Always
,我们最多丢失一条指令;当设置为每秒刷一次盘的 Eversec
时,最多丢失一秒内的数据;当设置为非主动刷盘的 No
时,则可能丢失上次刷盘后到现在的全部数据。
# 问题详解
# 1. RDB
RDB 是 Redis 提供的持久化机制之一,它通过将内存中的数据保存到磁盘中的二进制文件来实现。
我们可以通过 SAVE
或 BGSAVE
指令主动触发快照的生成,也可以通过配置文件中的 save
配置快照的自动生成条件。
在现实中出于性能考虑,我们不可能非常频繁的保存快照,因此要防止数据丢失,最终还是主要依靠 AOF 实现。
关于 RDB,具体可参考:✅ Redis的RDB是怎么实现的? (opens new window)
# 2. AOF
AOF 是 Redis 提供的另一套持久化机制。当每个写命令被执行完毕后,它们会被追加写入 AOF 日志文件的末尾。当 Redis 宕机以后,就可以通过 AOF 日志重放这些命令来恢复数据。
不过,每次命令执行后,数据会先写入 AOF 缓存,然后再写入操作系统缓存,最后才会根据刷盘策略真正的写入磁盘。因此刷盘策略真正决定了 Redis 宕机时会丢失多少数据:
Always
:每执行一条指令就刷一次盘,宕机时最多丢失一条指令;Eversec
:每秒刷一次盘,宕机时最多丢失一秒内的数据;No
:不主动刷盘,由操作系统自己完成,宕机时最多丢失从上一次刷盘到宕机时的全部数据;
关于 AOF,具体可参考:🛎️ Redis的AOF是怎么实现的? (opens new window)