当前位置:首页 > 问答 > 正文

Redis重启了数据到底还在不在啊,怎么回事有没有丢失情况

不一定,完全取决于你的Redis是如何配置的。 数据可能毫发无损,也可能全部丢失,这听起来可能有点让人担心,但理解了背后的原理,你就能完全掌控它。

你可以把Redis的数据持久化想象成不同的“保存”策略,就像你玩电脑游戏一样。

完全不保存(默认情况下竟然是危险的)

如果你安装好Redis后,完全没有动过它的配置文件(默认配置),那么重启Redis后,所有数据都会丢失,这是因为,默认情况下,Redis为了追求极致的速度,默认是把所有数据都放在内存里的,它就像你正在电脑上编辑一个非常重要的文档,但你既没有按“Ctrl+S”保存,也没有开启Word的自动保存功能,这时候如果突然停电或者你强行关闭了程序,那么你上次打开文档以来做的所有工作就白费了。

千万不要在默认配置下把Redis用于存储重要数据,那只适合做临时缓存。

定时快照(就像游戏里的手动存档点)

Redis重启了数据到底还在不在啊,怎么回事有没有丢失情况

这是Redis最主要的一种持久化方式,叫做RDB,你可以在配置文件里设置规则,

  • 每隔900秒(15分钟),如果至少有1个键被改变,就保存一次。
  • 每隔300秒(5分钟),如果至少有10个键被改变,就保存一次。
  • 每隔60秒,如果至少有10000个键被改变,就保存一次。

这就像你设定了一个规则:“我每打死10个小怪,就手动存档一次”,当Redis满足这些条件时,它就会把当前内存中所有数据的一个完整副本(快照)保存到硬盘上一个叫做dump.rdb的文件里。

那么重启后数据在不在呢?

  • 如果在最后一次“存档”(生成RDB文件)之后,还没有达到你设定的存档条件,Redis就重启了,那么从上次存档到重启之间的数据就会丢失。 比如你设定每5分钟存一次,但在第4分钟时服务器宕机了,那这4分钟内的新数据就没了。
  • 重启时,Redis会自动去寻找这个dump.rdb文件,如果找到了,就会把里面的数据全部加载回内存,这样你就恢复到了最后一次存档时的状态。

这种方式的优点是恢复数据非常快(因为是整个数据集的二进制文件),缺点是可能会丢失几分钟的数据。

Redis重启了数据到底还在不在啊,怎么回事有没有丢失情况

记录操作日志(就像游戏里的自动回放功能)

这是另一种更精确的持久化方式,叫做AOF,开启AOF后,Redis会把每一个会改变数据集的写命令(比如set, hset, lpush等)都记录到一个日志文件(通常是appendonly.aof)的末尾,这不像存档,而像是有一台摄像机在全程录制你的游戏操作。

那么重启后数据在不在呢?

  • 重启时,Redis会重新读取这个日志文件,把里面记录的命令从头到尾再执行一遍,这样就能精确地重建出重启前的数据状态。
  • 理论上,这种方式最多只会丢失一秒的数据(因为你可以配置为每秒同步一次日志到硬盘),甚至可以配置为每个命令都同步,那样就几乎不会丢失数据,但速度会变慢。

混合持久化(存档点+操作回放,强强联合)

Redis重启了数据到底还在不在啊,怎么回事有没有丢失情况

这是现在比较推荐的方式,既然RDB恢复快但丢数据多,AOF丢数据少但恢复慢,那能不能结合一下?当然可以。

在开启AOF的前提下,Redis 4.0以后支持混合持久化,当Redis需要创建AOF文件或者重写AOF文件时,它会先像RDB那样把当前数据的完整快照写入AOF文件的开头,然后再把这一段时间内产生的增量写命令(AOF格式)追加到文件后面。

这样重启的时候:

  1. Redis会先加载AOF文件中开头的RDB快照部分,这很快,让你迅速恢复大部分数据。
  2. 然后再重放后面一小部分的AOF日志,来恢复快照之后的最新数据。

这就像你先读取了一个最近的存档,然后游戏自动帮你快速回放了从存档点到你掉线前的最后几秒操作,既快又安全。

  • 数据会不会丢,完全看你选了哪种“保存”方式。
  • 没配置(默认):数据全在内存,重启必丢
  • 只用RDB(定时快照):可能会丢失从最后一次快照到重启之间的数据(几分钟)。
  • 只用AOF(操作日志):最多丢失一秒的数据,甚至可以不丢。
  • RDB+AOF混合:兼顾速度和数据安全,推荐使用。

当你问Redis重启数据在不在的时候,首先要做的就是去检查你的Redis配置文件(通常是redis.conf),看看里面关于save(RDB)、appendonly(AOF)和aof-use-rdb-preamble(混合持久化)这些选项是怎么设置的,你的数据命运,就写在这个配置文件里。

(参考来源:Redis官方文档关于持久化的章节,以及《Redis设计与实现》一书的相关内容)