文章目录

  • 1. RDB持久化
  • 1.1 RDB 持久化配置
  • 1.2 RDB 持久化的过程
  • 2. AOF 写入日志



由于 redis 存储在内存中且提供一般编程语言常用的数据结构存储类型,所以经常被用于做服务器崩溃宕机的数据恢复处理。服务器可以在某些指定过程中将需要保存的数据以 json 对象等方式存储到 redis 中,也就是我们常说的快照,当服务器运行时读取 redis 来判断是否有待需要恢复数据继续处理的业务。当一次业务处理结束后再删除redis 的数据即可。

redis 提供两种将内存数据导出到硬盘实现数据备份的方法:RDB持久化 和 AOF 写入日志。

1. RDB持久化

1.1 RDB 持久化配置

RDB 方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时 Redis 会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB 是 redis 默认采用的持久化方式,在配置文件中已经预置了3个条件:

save 900 1      #900秒内有至少1个键被更改则进行快照
save 300 10     #300秒内有至少10个键被更改则进行快照
save 60 10000   #60秒内有至少10000个键被更改则进行快照

可以存在多个条件,条件之间是"或"的关系,只要满足其中一个条件,就会进行快照。 如果想要禁用自动快照,只需要将所有的 save 参数删除即可。

Redis 默认会将快照文件存储在当前目录(可CONFIG GET dir来查看)的 dump.rdb文件中,可以通过配置 dirdbfilename两个参数分别指定快照文件的存储路径和文件名。

1.2 RDB 持久化的过程

  1. Redis 使用 fork 函数复制一份当前进程(父进程)的副本(子进程)。
  2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。
  3. 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此一次快照操作完成。
  4. 在执行 fork 的时候操作系统(类Unix操作系统)会使用写时复制(copy-on-write)策略,即 fork 函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令 ),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的 RDB 文件存储的是执行 fork 一刻的内存数据。

Redis 在进行快照的过程中不会修改 RDB 文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB 文件都是完整的。这使得我们可以通过定时备份 RDB 文件来实现 Redis 数据库备份。RDB 文件是经过压缩(可以配置 rdbcompression 参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。

除了自动快照,还可以手动发送 SAVEBGSAVE命令让 Redis 执行快照,两个命令的区别在于,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过 fork 子进程进行快照操作。 Redis 启动后会读取 RDB 快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内 存中需要花费20~30秒钟。 通过 RDB 方式实现持久化,一旦Redis 异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用 AOF 方式进行持久化。

2. AOF 写入日志

默认情况下 Redis 没有开启 AOF(append only file) 方式的持久化,可以在 redis.conf中通过 appendonly参数开启:

appendonly yes

在启动时 Redis 会逐个执行 AOF 文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较 RDB 会慢一些。

开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入硬盘中的 AOF 文件。AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir参数设置的,默认的文件名是 appendonly.aof,可以通过 appendfilename参数修改:

appendfilename appendonly.aof

配置 redis 自动重写 AOF 文件的条件

# 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据
auto-aof-rewrite-percentage 100
# 允许重写的最小AOF文件大小
auto-aof-rewrite-min-size 64mb
#配置写入AOF文件后,要求系统刷新硬盘缓存的机制
# 每次执行写入都会执行同步,最安全也最慢
appendfsync always
# 每秒执行一次同步操作
appendfsync everysec
 # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),最快也最不安全
appendfsync no

Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少