Redis 持久化

1、持久化机制产生的背景

  1. Redis 对数据的读取操作,都是在内存中进行的,这样一来不可避免有数据丢失的可能,比如宕机。人们要求在服务重启的时候可以将之前的数据进行恢复,Redis 提供的持久机制就是用来解决这一问题的。
  2. Redis 提供了两种持久化方式,分别是 RDB 和 AOF。

2、RDB 持久化方式

RDB(Redis Database File) 持久化方式是 Redis 默认的方式,它对 redis 中的数据执行周期性的持久化。因此会存在不同时间点的备份数据,在做数据还原时,可以自由选择。

2.1、RDB 自动触发方式

  1. save:这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘。默认的配置如下 :
# 表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 900 1
# 表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 300 10
# 表示60 秒内如果至少有 10000 个 key 的值变化,则保存
save 60 10000
  1. 只要达到配置的条件,Redis 就会自动调用 BGSAVE 命令进行保存(非阻塞)

2.2、RDB 手动触发方式

手动触发是通过 SAVAE 命令或者 BGSAVE 命令将内存数据保存到磁盘文件中。SAVE 命令会阻塞 Redis 服务器进程,直到快照文件创建完毕为止,在这个过程中,服务器不能处理任何的命令请求。BGSAVE 命令是非阻塞式的。

3、AOF 持久化方式

AOF(Append Only File) 持久化方式会记录每条写入操作,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。

3.1、AOF 的触发方式

  1. always:每次发生数据变更都会被立即记录到磁盘,性能较差,但数据完整性比较好。
  2. everysec(默认):每秒钟将AOF缓冲区的内容写入AOF文件,如果宕机,就会有1秒内的数据丢失。
  3. no:将数据同步操作交给操作系统来处理,性能最好,但是数据可靠性最差。
  4. 这3种方式都可以在配置文件中进行配置,默认是:apendfsync everysec。

3.2、重写操作

在AOF持久化模式下,每个写命令都会追加到AOF文件,随着时间推移,AOF文件会越来越大,为了避免AOF产生的文件太大,服务器会对AOF文件进行重写,将操作相同键(Key)的相同命令合并,从而减少该文件的大小。

3.3、AOF 注意事项

Redis 是支持事务的,而按照 AOF 同步机制,如果只是宕机发生了,则可能只写入了一个完整事务的部分操作。在 Redis 重启时,如果检测到这种不完整的事务操作,将会退出并显示错误信息。使用redis-check-aof 工具可以修复AOF文件,删除掉该文件中的事务部分,这样服务器就可以重新启动了。

4、Q & A

持久化机制的意义

  1. 保证了大部分的内存数据不会丢失
  2. 服务重启后,进行数据数据恢复,可以快速的对外提供服务
  3. 不会造成缓存雪崩问题

AOF 和 RDB 的比较

  1. RDB 会生成多个数据文件,每个数据文件都代表了某一个时刻中 redis 的数据。
  2. RDB 相对于 AOF 持久化机制来说,直接基于 RDB 数据文件来重启和恢复数据,更加快速。
  3. AOF 相对于 RDB 的数据备份更新完整。AOF一般隔1秒同步一次,所以最多只会丢失1秒钟的数据,而 RDB 的备份方式,由于是全量备份,为了性能等因素,一般时间间隔都设置得比较长(5分钟以上),因此数据也会丢失得比较多。
  4. AOF文件会以文本格式保存所有写操作命令,且未经压缩,RDB 是以二进制保存的文件。对于同一数据集,AOF文件通常大于等效的RDB文件。
  5. AOF文件包含了所有操作的日志,而且很容易看懂,当用户不小心使用了flushall命令,flushall会把所有的数据删除,但是可以根据AOF文件找到错误的命令,把这些错误的指令删除,然后重新启动Redis,就可以恢复对应的业务数据。

AOF 和 RDB 的数据恢复顺序

  1. 如果开启了AOF,则使用AOF持久化文件恢复数据,否则使用RDB持久化文件恢复数据
  2. 若AOF文件和RDB文件都不存在,则直接启动Redis。

AOF + RDB 的混合模式

在Redis 4之后的版本新增了AOF+RDB混合模式,先使用RDB存储快照,然后使用AOF持久化记录所有的写操作,当满足重写策略或手动触发重写的时候,将最新的数据存储为新的RDB记录。重启服务时会从RDB和AOF两部分恢复数据,既保证了数据的完整性,又提高了数据恢复的性能。

AOF 和 RDB 如何选择

使用RDB持久化会有数据丢失的风险,但是数据恢复的速度快;使用AOF持久化可以保证数据的完整性,但数据恢复的速度慢。因此应采用 AOF + RDB 混合模式。

posted @ 2022-06-12 17:15  weidadong  阅读(37)  评论(0)    收藏  举报