Redis 持久化
Redis 持久化主要有两种方式,RDB 和 AOF
RDB(Redis DataBase)
RDB 持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。
RDB 有手动触发和自动触发两种触发方式。
手动触发:
- save命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用;
- bgsave命令:Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。
自动触发:
redis.conf
中配置save m n
,即每 m 秒内有 n 次修改时,自动触发bgsave
生成 rdb 文件;- 主从复制时,从节点要从主节点进行全量复制时也会触发
bgsave
操作,生成当时的快照发送到从节点; - 执行 debug reload 命令重新加载 redis 时也会触发 bgsave 操作;
- 默认情况下执行 shutdown 命令时,如果没有开启 aof 持久化,那么也会触发 bgsave 操作。
使用 RDB 模式的优点:
- RDB 文件是某个时间节点的快照,默认使用 LZF 算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景;
- Redis 加载 RDB 文件恢复数据要远远快于 AOF 方式;
使用 RDB 模式的缺点:
- RDB 方式实时性不够,无法做到秒级的持久化;
- 每次调用 bgsave 都需要 fork 子进程,fork 子进程属于重量级操作,频繁执行成本较高;
- RDB 文件是二进制的,没有可读性,AOF 文件在了解其结构的情况下可以手动修改或者补全;
- 版本兼容 RDB 文件问题。
AOF(Append-Only File)
AOF 采用写后日志,即先写内存,后写日志。AOF 写回策略共有三种,默认的配置项为 Everysec:
AOF 重写过程是由后台进程 bgrewriteaof 来完成的。主线程 fork 出后台的 bgrewriteaof 子进程,fork 会把主线程的内存拷贝一份给 bgrewriteaof 子进程,这里面就包含了数据库的最新数据。然后,bgrewriteaof 子进程就可以在不影响主线程的情况下,逐一把拷贝的数据写成操作,记入重写日志。
使用 AOF 模式的优点:
- 实时性强,发生故障丢失数据少。
使用 AOF 模式的缺点:
- 日志文件体积大
- 恢复速度慢