不同于memcached,redis支持数据本地持久化。

redis支持两种持久化方式:

  • RDB持久化,可以在指定时间内生成数据快照,持久化当前状态,命令有SAVE和BGSAVE
  • AOF持久化,保存数据库所执行的写命令来记录数据库状态

RDB持久化

两个命令用于生成RDB文件,SAVE和BGSAVE:

  • SAVE,直接阻塞服务器进程生成RDB文件,客户端的所有命令请求都会被拒绝
  • BGSAVE,派生出一个子进程,子进程负责创建RDB文件,服务器继续处理其他命令

RDB文件载入在服务器启动时自动载入,没有专门用于载入RDB文件的命令。

命令执行期间:

  • GSAVE命令和执行期间,服务器拒绝执行SAVE命令
  • GSAVE命令和执行期间,客户端的BGREWRITEAOF命令会被延迟到BGSAVE执行完毕后执行
  • BGREWRITEAOF命令期间,BGSAVE命令会被服务器拒绝

自动间隔保存:save 9 1

RDB文件时一个压缩过的二进制文件,对不同的类型使用不同凡事保存,RDB文件结构如下:

AOF持久化

持久化配置通过appendfsync选项的值来决定吗,默认everysec:

BGREWRITEAOF命令:AOF重写,AOF文件越来越大,会进行重写,节省空间。

创建一个子进程会进行AOF重写,服务器继续处理其他命令。在执行BGREWRITEAOF命令时服务器会维护一个AOF重写缓冲区,该缓冲区会记录子进程创建新AOF文件期间所执行所有写命令,当子进程完成后追加到新AOF文件末尾,使旧新文件保持一致,最后用原子操作心得替换旧的AOF文件。

优缺点

RDB的优点:

  1. RDB时非常紧凑的文件,保存了某个时间点的所有数据,非常适合备份以及备份恢复。
  2. 适用于灾难恢复,只是一个文件可以到别的redis数据库恢复数据
  3. RDB最大化服务器性能,用子进程处理RDB文件,服务器无需IO处理
  4. 恢复大数据集会比AOF速度要快

RDB的缺点:

  1. 时间点保存RDB文件,会有时间间隙,不适合不能接受丢失数据场景
  2. fork子进程,当数据集庞大时非常耗时

AOF的优点:

  1. AOF文件只是追加命令,不需要文件定位,很快
  2. 当AOF文件体积较大时重写AOF,保存所有命令的最小集
  3. AOF有序的保存了执行的所有命令

AOF的缺点:

  1. 对于相同的数据集,AOF文件要大于RDB文件
  2. AOF的速度相比RDB会慢,服务器主进程追加命令,重写是才会fork子进程,服务器响应会受影响

redis可以同时使用RDB持久化和AOF持久化,重启时优先使用AOF文件来还原数据,因为AOF文件相比RDB更完整保存数据集

更多源码注释说明见https://github.com/dalaizhao/redis/tree/feature_code_comment