一、RDB 持久化
启用 RDB 持久化
redis 会默认启用 RDB 持久化方式。
配制描述
save 60 10000
·
每隔 60s,若超过 10000 个 key 发生了变更,那么就会生成一个新的 dump.rdb 文件,这个文件存储是 redis 内存中完整的数据快照,这个过程被称之为 snapshotting
工作流程
redis 会在指定的时间间隔内(通过文件设置的)将内存中的数据集快照写入磁盘。
具体操作过程是redis会 fork 一个子进程,先将数据集写入临时的快照文件,完成写入后,会替换之前的 dump.rdb 文件,文件是用二进制压缩存储的。在重启时,会通过加载 dump.rdb 文件恢复数据。
二、AOF 持久化
启用 AOF 持久化
AOF 持久化,默认是关闭的,可通过appendonly yes
来打开 AOF 持久化机制
工作流程
通过日志的形式来记录每个写操作,当 redis 收到一条写指令时,会先写入 os cache,然后定期 fsync 更新到磁盘文件。
Redis 重启的会根据AOF文件的内容将指令从前到后执行一次以完成数据的恢复工作,如果 AOF 和 RDB 都开启了,AOF 优先级更高。
AOF 的 fsync 策略
#appendfsync always //每次写入一条数据就执行一次fsync;
appendfsync everysec //每隔一秒执行一次fsync
#appendfsync no //不主动执行fsync,由操作系统自身来决定更新到磁盘的时机
AOF 文件重写(rewrite)机制
因为采用了追加方式,如果不做任何处理的话,AOF 文件会变得越来越大,而 redis 会不断淘汰旧有数据,为此,redis 提供了 AOF 文件重写(rewrite)机制。
AOF文件重写流程
1、redis 会 fork 一个子进程,子进程基于当前数据库中的数据,构建日志,开始往一个新的 AOF 文件中写入日志。
2、子进程在执行 AOF 重写时,主进程需要执行以下三个工作: 执行 client 发来的命令请求;将写命令追加到现有的 AOF 文件中;将写命令追加到AOF重写缓存
中。
3、子进程完成对 AOF 文件的重写之后,会向主进程发送一个完成信号,主进程接到信号之后,会调用一个信号处理函数,该函数的功能是:将AOF重写缓存
中的内容全部写入到新的 AOF 文件中;用新的 AOF 文件替换掉现有的 AOF 文件
AOF文件重写配制描述
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
如果较上次重写之后,AOF文件的大小增长了100%,且现有文件大小已经超过64,即会触发rewrite