十五 Redis——Redis 持久化之 RDB 机制 和 AOF 机制( 二 )


在客户端执行命令关闭服务器时,那么会自动执行一次,就会以方式触发持久化 。
自动触发机制的场景:
1、配置redis.conf 触发规则,自动执行持久化
2、执行命令关闭服务器,以方式触发持久化
3、执行命令,会触发自动持久化
2、AOF 持久化
AOF 持久化
快照功能并不是非常耐久(): 如果 Redis 因为某些原因而造成故障停机,那么服务器将丢失最近写入、且仍未保存到快照中的那些数据 。
尽管对于某些程序来说,数据的耐久性并不是最重要的考虑因素,但是对于那些追求完全耐久能力(full )的程序来说,快照功能就不太适用了 。
从 1.1 版本开始,Redis 增加了一种完全耐久的持久化方式: AOF 持久化 。
你可以通过修改配置文件来打开 AOF 功能:默认为no,表示不开启
appendonly yes
从现在开始,每当 Redis 执行一个改变数据集的命令时(如写操作),这个命令就会被以日志的形式记录下来(读操作不记录),并追加到 AOF 文件的末尾 。AOF 文件的默认文件名为 .aof
这样的话,当 Redis 重新启时,程序就可以通过重新执行 AOF 文件中的内容将写指令从前到后执行一次完成数据恢复的目的 。
更多关于AOF 持久化配置的说明,请参考:Redis(十四)——Redis 6.0.12 配置文件详解
AOF 的运作方式
AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制 。
以下是 AOF 重写的执行步骤:
Redis 执行 fork(),现在同时拥有父进程和子进程 。子进程开始将新 AOF 文件的内容写入到临时文件 。对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾: 这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的 。当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾 。搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾 。
AOF 持久化的优缺点
AOF 的优点
AOF 的缺点
重写机制
AOF的方式也同时带来了另一个问题 。持久化文件会变的越来越大 。为了压缩aof的持久化文件 。redis提供了命令 。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写 。
重写aof文件的操作,并没有读取旧的aof文件,重写aof方式:基于Copy On Write,全量遍历内存中数据,然后逐个序列到新的AOF文件中(这点和快照有点类似) 。因此AOF 能够正确反应当前内存数据的状态 。
测试AOF 持久化
1、在redis-conf 配置文件中打开 AOF 功能:
appendonly yes
2、重启redis服务
发现在redis的启动目录下 。出现了一个名为 .aof 的AOF文件
修复 AOF 文件
服务器可能在程序正在对 AOF 文件进行写入时停机,如果停机造成了 AOF 文件出错(),那么 Redis 在重启时会拒绝载入这个 AOF 文件,从而确保数据的一致性不会被破坏 。
1、设置两个key:
127.0.0.1:6379> set k1 v1 OK127.0.0.1:6379> set k2 v2OK127.0.0.1:6379> get k1"v1"
2、查看aof文件中的内容:
3、修改aof文件中的内容,让aof文件出现错误:保存退出vim
4、重启 redis 服务器,客户端重新连接,发现连接失败:
这是因为检测到aof文件出现错误,因此拒绝了连接 。
5、使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复