Redis-持久化

思维导图

Redis 数据持久化主要有两大机制,AOF日志RDB快照

一、RDB

内存快照:指内存中的数据在某一时刻的状态记录。

Redis 提供两个命令来生成 RDB 文件,save 和 bgsave。

  • save:在主线程中执行,会导致阻塞;
  • bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置;
写时复制技术

写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。Redis 采用该技术保证快照期间数据可以修改。

RDB文件生成

如图,主线程 fork 出 bgsave 子进程,可以共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内存数据,并写入RDB文件。
此时,主线程对键值对C进行修改,键值对C会生成一个副本,bgsave 子进程会把这个副本写入 RDB 文件。

二、AOF

Redis 先执行命令到内存后,然后把命令内容写入 AOF 日志中。

AOF 三种写策略
  • Always:同步写回。每个写命令执行完,立马同步地将日志写回磁盘;
  • Everysec:每秒写回。每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;
  • No:操作系统控制的写回,每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。
AOF 重写机制

AOF 日志文件过大时,如果 redis 宕机,通过 AOF 进行数据恢复时,效率会很低。通过 AOF 日志重写去掉冗余的写命令,来缩小文件大小。
重写流程

如图 AOF 重写过程,重写前 6 条命令,重写后 1 条命令。

AOF 重写原理

一句话概括重写原理“一处拷贝,两处日志”。
一处拷贝:重写时,主线程 fork 出后台的 bgrewriteaof 子进程,fork 会把主线程的内存拷贝一份给 bgrewriteaof 子进程。然后,bgrewriteaof 子进程就可以在不影响主线程的情况下,逐一把拷贝的数据写成操作,记入重写日志;
第一处日志:指正在使用的AOF日志,Redis会把新来的操作写入缓冲区,保证数据完整性;
第二处日志:指重写后新的AOF日志,Redis会把新来的操作写入缓冲区,保证数据完整性;

最后就可以用新的AOF日志替换旧的日志。

三、AOF和RDB对比

命令 RDB AOF
启动优先级
体积
恢复速度
数据安全性 丢数据 根据策略决定
轻重

由于 AOF 更新频率通常比 RDB 高,如果 AOF 开启时,服务器默认使用 AOF 恢复数据。

四、混合使用AOF日志和内存快照

Redis 4.0中提出了混合使用AOF日志和内存快照的方法。
内存快照以一定的频率执行,使用 AOF 日志记录两次快照期间所有的命令操作。这样即避免了 RDB 频率过高,也避免了 AOF 文件过大。

你可能感兴趣的:(Redis-持久化)