Redis支持内存数据持久化,将存储在内存中的数据以某种形式持久化到硬盘中,Redis重启后仍能加载硬盘中的数据重新使用。

Redis有两种持久化方式:一种RDB,一种AOF。

Redis默认的持久化方式为RDB,两种持久化方式可以单独使用,也可结合使用。

RDB

  • RDB方式是通过快照来完成的,当符合一定的条件时,Redis会自动将内存中的所有数据进行快照并存储到硬盘上。进行快照的条件在配置文件中指定,有两个参数:时间和改动的键的个数

  • 当在指定时间内被更改的键的个数大于指定数值时,就会进行快照。

  • Redis在以RDB方式持久化数据时,是以一个子进程来做的,也就是说进行RDB持久化时,不会影响Redis的主进程对外的使用。

RDB并不能绝对保证数据的不丢失

RDB的快照过程:

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程)。
  2. 父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入到硬盘中的临时文件。
  3. 当子进程写入完所有数据后,会用该临时文件替换旧的RDB文件(默认是压缩过的)。

可以通过SAVE和BGSAVE命令来手动快照,前者是由主进程进行快照,会阻塞其它请求;后者是通过fork子进程来进行快照。


AOF

  • AOF持久化策略是将发送到Redis端的每一条命令都记录下来,并保存到硬盘中的AOF文件,AOF文件和RDB文件位置相同。

AOF持久化方式是默认关闭的,通过配置文件中的appendonly参数设为YES开启。

AOF文件对于查询的操作不做记录

AOF文件到磁盘的同步策略

  1. appendfsync always 每次都同步(最安全,但也最慢)
  2. appendfsync everysec 每秒同步(默认的同步策略)
  3. appendfsync no 不主动同步,由操作系统来决定

文件默认先写到缓存中,系统每30秒同步一次,才是真正写入到磁盘