目录

持久化实现

命令追加

写入与同步

载入与数据还原

还原步骤

AOF重写

AOF重写实现

AOF 后台重写

AOF 后台重写的触发条件


Redis 分别提供了 RDB 和 AOF 两种持久化机制:

  • RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。
  • AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。

被写入AOF文件的所有命令都是以协议文本方式保存,SELECT命令是服务器自动添加。

持久化实现

命令追加

当AOF功能打开时,服务器执行完一个写入命令后,会以协议格式将命令写入aof_buf缓冲区。

写入与同步

Redis服务器的一个事件循环(loop)中,每次结束循环前,都会判断是否需要把aof_buf缓冲区的内容写入到AOF文件。然后再把文件保存(同步)到磁盘。

为了提供文件效率,现代操作系统,当写数据到文件时,通常会将数据保存在一个内存缓冲区,等待内存缓冲区被写满或超过指定时限,才将缓冲区数据写入磁盘。

其行为由配置appendfsync决定:

  • always:所有aof_buf内容写入AOF,并同步。
  • everysec:默认值。所有aof_buf内容写入AOF,如果上次同步已超过1秒,则再次同步(同步操作由一个线程专门负责)。
  • no:所有aof_buf内容写入AOF。同步由操作系统控制。

载入与数据还原

还原步骤

  1. 创建伪客户端,REDIS命令只能在客户端上执行,载入AOF来源于文件而不是网络。
  2. 读取一条写命令
  3. 使用伪客户端执行写命令
  4. 执行所有写命令,载入完毕

为了避免对数据的完整性产生影响, 在服务器载入数据的过程中, 只有和数据库无关的订阅与发布功能可以正常使用, 其他命令一律返回错误。

AOF重写

AOF 文件通过同步 Redis 服务器所执行的命令, 从而实现了数据库状态的记录, 但是, 这种同步方式会造成一个问题: 随着运行时间的流逝, AOF 文件会变得越来越大

为了解决以上的问题, Redis 需要对 AOF 文件进行重写(rewrite): 创建一个新的 AOF 文件(当前状态快照)来代替原有的 AOF 文件, 新 AOF 文件和原有 AOF 文件保存的数据库状态完全一样, 但新 AOF 文件的体积小于等于原有 AOF 文件的体积

AOF重写实现

所谓的“重写”其实是一个有歧义的词语, 实际上, AOF 重写并不需要对原有的 AOF 文件进行任何写入和读取, 它针对的是数据库中键的当前值

AOF 后台重写

AOF 重写程序可以很好地完成创建一个新 AOF 文件的任务, 但是, 在执行这个程序的时候, 调用者线程会被阻塞

很明显, 作为一种辅佐性的维护手段, Redis 不希望 AOF 重写造成服务器无法处理请求, 所以 Redis 决定将 AOF 重写程序放到(后台)子进程里执行, 这样处理的最大好处是:

  1. 子进程进行 AOF 重写期间,主进程可以继续处理命令请求。

  2. 子进程带有主进程的数据副本,使用子进程而不是线程,可以在避免锁的情况下,保证数据的安全性

不过, 使用子进程也有一个问题需要解决: 因为子进程在进行 AOF 重写期间, 主进程还需要继续处理命令, 而新的命令可能对现有的数据进行修改, 这会让当前数据库的数据和重写后的 AOF 文件中的数据不一致。

为了解决这个问题, Redis 增加了一个 AOF 重写缓存, 这个缓存在 fork 出子进程之后开始启用, Redis 主进程在接到新的写命令之后, 除了会将这个写命令的协议内容追加到现有的 AOF 文件之外, 还会追加到这个缓存中。

换言之, 当子进程在执行 AOF 重写时, 主进程需要执行以下三个工作:

  1. 处理命令请求。

  2. 将写命令追加到现有的 AOF 文件中。

  3. 将写命令追加到 AOF 重写缓存中。

这样一来可以保证:

  1. 现有的 AOF 功能会继续执行,即使在 AOF 重写期间发生停机,也不会有任何数据丢失。
  2. 所有对数据库进行修改的命令都会被记录到 AOF 重写缓存中

当子进程完成 AOF 重写之后, 它会向父进程发送一个完成信号, 父进程在接到完成信号之后, 会调用一个信号处理函数, 并完成以下工作:

  1. AOF 重写缓存中的内容全部写入到新 AOF 文件中。
  2. 对新的 AOF 文件进行改名,覆盖原有的 AOF 文件。

当步骤 1 执行完毕之后, 现有 AOF 文件、新 AOF 文件和数据库三者的状态就完全一致了。

当步骤 2 执行完毕之后, 程序就完成了新旧两个 AOF 文件的交替。

这个信号处理函数执行完毕之后, 主进程就可以继续像往常一样接受命令请求了。 在整个 AOF 后台重写过程中, 只有最后的写入缓存和改名操作会造成主进程阻塞, 在其他时候, AOF 后台重写都不会对主进程造成阻塞, 这将 AOF 重写对性能造成的影响降到了最低。

AOF 后台重写的触发条件

AOF 重写可以由用户通过调用 BGREWRITEAOF 手动触发。

另外, 服务器在 AOF 功能开启的情况下, 会维持以下三个变量:

  • 记录当前 AOF 文件大小的变量 aof_current_size
  • 记录最后一次 AOF 重写之后, AOF 文件大小的变量 aof_rewrite_base_size
  • 增长百分比变量 aof_rewrite_perc

每次当 serverCron 函数执行时, 它都会检查以下条件是否全部满足, 如果是的话, 就会触发自动的 AOF 重写:

  1. 没有 BGSAVE 命令在进行。
  2. 没有 BGREWRITEAOF 在进行。
  3. 当前 AOF 文件大小大于 server.aof_rewrite_min_size (默认值为 1 MB)。
  4. 当前 AOF 文件大小和最后一次 AOF 重写后的大小之间的比率大于等于指定的增长百分比。

默认情况下, 增长百分比为 100% , 也即是说, 如果前面三个条件都已经满足, 并且当前 AOF 文件大小比最后一次 AOF 重写时的大小要大一倍的话, 那么触发自动 AOF 重写。

redis(11)--AOF持久化相关推荐

  1. 天天在用Redis,那你对Redis的AOF持久化到底了解多少呢?

    为什么需要持久化,以及Redis持久化的RDB方式在这篇文章讲的已经很透彻了,足以吊打面试官了.而且此篇内容需要RDB文章的内容支持,所以建议先看下:看完这篇还不懂Redis的RDB持久化,你们来打我 ...

  2. Redis的AOF持久化的实现

    Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中. AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参 ...

  3. 图解redis的AOF持久化

    目录 1.引言 2.AOF持久化的实现 2.1命令追加 2.2AOF文件的写入 3.AOF的文件载入和数据还原 4.AOF重写 4.1AOF重写实现 4.2AOF后台重写(BGREWRITEAOF) ...

  4. Redis数据持久化之AOF持久化

    一.RDB持久化的缺点 创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执 ...

  5. 十九 Redis AOF持久化

    RDB 持久化的缺点RDB 持久化,这种持久化可以将数据库里面的数据以二进制文件的形式储存到硬盘里面. RDB 持久化有一个缺点,那就是,因为创建 RDB 文件需要将服务器所有数据库的数据都保存起来, ...

  6. Redis的AOF日志

    如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了吗? 这种保存写操作命令 ...

  7. Redis的AOF的配置

    Redis的AOF持久化 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),Aof保存的是appendonly.aof文件,只许追加文件但不可以改写文件,redis ...

  8. 来说说Redis两种持久化方式的优缺点

    前言 Redis是一种K-V数据库,它的数据也可以进行持久化操作.因为redis的数据都保存在内存中,如果不进行及时的持久化,可能就会因为重启导致数据的丢失.这时候就需要对redis进行持久化操作,将 ...

  9. 第11章 AOF持久化

    AOF持久化在硬盘上保存的是对Redis进行的逻辑操作,类似InnoDB中的bin log.说白了就是你对一个Redis输入了哪些语句,AOF文件都会原封不动的保存起来,等到需要回复Redis的时候再 ...

  10. 《Redis设计与实现》第十一章 AOF持久化

    第十一章 AOF持久化 11.1 AOF持久化的实现 AOF持久化功能实现分为命令追加.文件写入.文件同步三个步骤. 11.1.1 命令追加 当AOF持久化功能出于打开状态时,服务器执行完一个写命令之 ...

最新文章

  1. 人类高质量AI训练方式:精细化数据集管理颠覆唯SOTA论
  2. 三层学习------实践篇
  3. OutOfMemoryException异常解析
  4. 给网页标题添加icon小图标
  5. vue3,对比 vue2 有什么优点?
  6. 25款漂亮的 WordPress 杂志主题
  7. python函数回顾:abs()
  8. VoltDB开篇 简介
  9. java学生签到系统_学生签到系统.pdf
  10. 网络浏览器大战(Google与IE的较量)
  11. html设计判断闰年,判断是否是闰年_JavaScript判断是否闰年 闰年计算方法
  12. chromeos java安装_谷歌最新系统ChromeOS安装体验,酷!
  13. android 信号检测,卫星、手机信号都能测!安卓神器你值得拥有
  14. 科学计算机要用的电池是几号,科学计算器电池
  15. PID调节参数的作用
  16. 对大学三年学习生活的总结与反思
  17. R语言-用R眼看琅琊榜小说的正确姿势
  18. curator分布式锁
  19. 八字四柱排盘原理及源码(PHP、Java和Python)
  20. HTML5 CSS3 专题 诱人的实例 3D旋转木马效果相册

热门文章

  1. SL专题2:加入并熟悉Second Life世界
  2. Struts初步知识
  3. 搬了十次家,总算搬进了自己的家
  4. 产品经理如何激发出新的创意
  5. jmeter --- 基于InfluxDBGrafana的JMeter实时性能测试数据的监控和展示
  6. 【研究任务】linux系统开机启动过程
  7. Android项目实战(三十二):圆角对话框Dialog
  8. Python Numpy 笔记
  9. html5media使用
  10. 中国工商银行基金定投