redis持久化

redis支持RDB和AOF两种持久化机制,持久化功能能有效避免因进程退出造成的数据丢失问题

RDB

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发.

有两个命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE.
SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器阻塞期间,服务器不能处理任何命令请求.

和SAVE命令阻塞服务器进程的做法不同,BGSAVE命令会派生出一个子进程,然后由子进程创建RDB文件,父进程处理请求,RDB文件的载入工作是在服务区启动时自动执行的,Redis并没有专门用于载入RDB文件的命令.只要redis在启动时检测到RDB文件的存在,就会自动载入RDB文件.

如果服务器开启了AOF持久化功能,那么服务器就会优先使用AOF文件来还原数据库状态.
只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态.

自动触发RDB的机制:

  1. 使用save相关配置,如”save m n”.表示m秒内数据集存在n次修改时,自动触发bgsave.(服务器会维护一个dirty属性保存从上次保存RDB后,redis修改次数,还会维护一个lastsave属性保存上次执行保存的时间,通过这两个属性,redis就可以检测保存条件是否满足,reids默认每100ms检测一次).
  2. 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点.
  3. 执行debug reload命令重新加载redis时,也会触发save操作.
  4. 默认情况下执行shutdown时,如果没有开启AOF持久化功能则自动执行bgsave.

AOF

除了RDB持久化功能之外,Redis还提供了AOF持久化功能,与RBD持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的.

AOF会将所有的写命令追加到缓冲区中,AOF缓冲区根据对应的策略向硬盘做同步操作,随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩目的(ps:redis也是fork一个子进程执行AOF文件重写功能,AOF文件重写的原理就是读取内存中的键值对,直接对现存键值对进行记录,这样就可以省去从开始到现状经历的各种写操作). Snipaste_20210817_204213.png
为了避免子进程在进行AOF重写时,新的写命令导致AOF重写和内存现状不一致的情况,redis设置了AOF重写缓冲区,在主进程fork子进程进行重写任务的开始,新来的命令不仅会进入AOF缓冲区,而且也会进入AOF重写缓冲区,当子进程完成重写工作后,父进程会通知子进程将AOF重写缓冲区的内容写入到新的AOF文件中,这时新的AOF文件将会和当前内存保持一致.


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!