redis-持久化
不同于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的优点:
- RDB时非常紧凑的文件,保存了某个时间点的所有数据,非常适合备份以及备份恢复。
- 适用于灾难恢复,只是一个文件可以到别的redis数据库恢复数据
- RDB最大化服务器性能,用子进程处理RDB文件,服务器无需IO处理
- 恢复大数据集会比AOF速度要快
RDB的缺点:
- 时间点保存RDB文件,会有时间间隙,不适合不能接受丢失数据场景
- fork子进程,当数据集庞大时非常耗时
AOF的优点:
- AOF文件只是追加命令,不需要文件定位,很快
- 当AOF文件体积较大时重写AOF,保存所有命令的最小集
- AOF有序的保存了执行的所有命令
AOF的缺点:
- 对于相同的数据集,AOF文件要大于RDB文件
- AOF的速度相比RDB会慢,服务器主进程追加命令,重写是才会fork子进程,服务器响应会受影响
redis可以同时使用RDB持久化和AOF持久化,重启时优先使用AOF文件来还原数据,因为AOF文件相比RDB更完整保存数据集
更多源码注释说明见https://github.com/dalaizhao/redis/tree/feature_code_comment