AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。被写入AOF文件的所有命令都是以Redis的命令请求协议格式(纯文本)保存的。

一,AOF持久化的实现

1.命令追加

当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式把被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾:

struct redisServer{

  //AOF缓冲区

  sds aof_buf;

}

2.AOF文件的写入和同步

命令请求会先保存到AOF缓冲区中,然后在写入并同步到AOF文件。

Redis服务器进程是一个事件循环,在这个循环中有文件事件,有时间事件。文件事件负责接收客户端的命令请求和向客户端发送命令回复。时间事件负责执行定时运行的函数,比如:serverCron函数。

伪代码:

def eventLoop():

  while true:

    //处理文件事件,接收命令请求以及发送命令回复。处理命令请求时可能会有新内容被追加到aof_buf缓冲区中

    processFileEvents()

    //处理时间事件

    processTimeEvents()

    //考虑是否要把 aof_buf中的内容写入和保存到AOF文件中

    flushAppendOnlyFile()

写入:在现代操作系统中,当数据写入到文件中时,会调用write函数。操作系统会将写入数据暂时保存在一个内存缓存区中,等到缓冲区空间满的时候,才真正将缓冲区中的数据写入到磁盘中。

同步:同时系统也提供了同步函数,它可以强制让操作系统立即将缓冲区中的数据写入到磁盘中。

由上面的代码可以知道,在每个事件循环都会调用flushAppendOnlyFile函数,flushAppendOnlyFile函数的行为由appendfsync的值决定:

always:服务器在每个事件循环都要将aof_buf缓冲区中的所有内容写入到AOF文件中,并同步AOF文件(写入并同步)(,把aof_buf数据写入并同步到AOF文件中)

everysec:服务器在每个事件循环都要将aof_buf缓冲区中的所有内容写入到AOF文件中(先写入),并且每隔一秒就在子线程中对AOF文件进行一次同步(每隔一秒同步)。

no:服务器在每个事件循环都要将aof_buf缓冲区中的所有内容写入到AOF文件中(先写入),至于什么时候同步,由操作系统控制(不知道啥时候同步)。在该模式下的flushAppendOnlyFile的调用不需要同步执行。

二,AOF文件的载入和数据还原

1.数据还原:AOF文件中包含了重建数据库状态的所有写命令,所以服务器只要读入并重新执行一遍AOF文件里保存的写命令,就可以还原数据

2.步骤:

创建一个不带网络连接的伪客户端。(为什么是为客户端:Redis的命令只能在客户端上下文中执行,为什么是不带网络连接:命令来自AOF文件而不是网络连接)

从AOF文件中分析并读取一条写命令

使用伪客户端执行被读出的写命令

一直执行步骤2,3 。直到AOF文件中的所有写命令都被处理完毕

三,AOF重写

1.什么是AOF重写?

为了解决AOF文件体积膨胀,Redis服务器创建一个新的AOF文件替代现有的AOF文件,新旧两个文件保存的数据库状态相同,但是新AOF文件不会包含冗余命令。

Redis把新AOF文件替换旧AOF文件的功能叫 AOF文件重写。

2.AOF文件重写的实现

注意:AOF文件重写并不需要对现有的AOF文件进行如何读取,分析或写入操作,这个功能是通过读取服务器当前的数据库状态来实现的。

原理:首先从数据库中读取键现在的值,然后用一条命令记录键值对,代替之前记录这个键值对的多条命令。

【如果服务器想要用尽量少的命令来记录键的状态,那么最简单的办法不是去读取和分析现有AOF文件的内容,而是直接从数据库中读取键的值,然后用一条写命令来替代保存在AOF文件中的多条写命令,这样就可以把保存键的多条命令减少为一条。】

在实际中,为了避免在执行命令时造成客户端输入缓冲区溢出。在处理有多个元素的键时,会先检查键包含的元素数量,如果超过了一定的值,会使用多条命令来记录键的值。比如一个列表键包含了超过64个项,那么重写程序会用多条rpush命令来保存这个列表。

3.AOF后台重写

问题:由于Redis服务器使用单个线程处理命令请求,当服务器调用aof_rewrite函数时,在重写AOF文件期间,服务器无法处理客户端发送来的命令请求

解决:把AOF重写程序放到子进程中执行,这样子进程重写期间,父进程可以继续处理命令请求。并且子进程带有父进程的数据副本。

那么问题又来了:在子进程进行AOF重写期间,服务器进程在处理命令请求时可能会改变数据库状态,导致服务器当前数据库状态和重写后的AOF文件保存的数据库状态不一致

为了解决数据不一致问题,Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在创建子进程之后使用,当Redis服务器执行完一个写命令后,会同时把这个写命令发送给AOF缓冲区和AOF重写缓冲区。

在子进程执行AOF重写期间,服务器需要:

执行客户端发送过来的命令

将执行后的写命令追加到AOF缓冲区

将执行后的写命令追击到AOF重写缓冲区

当子进程完成重写工作后,向父进程发送一个信号,父进程在接到这个信号后,把AOF重写缓冲区中的所有内容写到新AOF文件中,并对新的AOF文件进行改名,覆盖现有的AOF文件。

转载于:https://www.cnblogs.com/inspred/p/10676708.html

《Redis设计与实现》之第十一章:AOF持久化相关推荐

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

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

  2. 《Reids 设计与实现》第十一章 服务器

    <Reids 设计与实现>第十一章 服务器 文章目录 <Reids 设计与实现>第十一章 服务器 一.简介 二.命令请求的执行过程 1.发送命令请求 2.读取命令请求 3.命令 ...

  3. 《Reids 设计与实现》第七章 RDB 持久化

    <Reids 设计与实现>第七章 RDB 持久化 文章目录 <Reids 设计与实现>第七章 RDB 持久化 一.简介 二.RDB 文件的创建与载入 1.SAVE 命令执行时的 ...

  4. 吃透Redis系列(五):RDB和AOF持久化详细介绍

    Redis系列文章: 吃透Redis系列(一):Linux下Redis安装 吃透Redis系列(二):Redis六大数据类型详细用法 吃透Redis系列(三):Redis管道,发布/订阅,事物,过期时 ...

  5. Redis设计与实现 笔记 第十七章 集群 cluster

    集群 Redis 集群是 Redis 提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能 17.1 节点 一个 Redis 集群通常由多个节点组成,在刚开始的时候,每个节点都 ...

  6. 第11章 AOF持久化

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

  7. 软件设计的哲学:第十一章 两次设计

    设计软件是困难的,所以你对如何构建一个模块或系统的最初想法不太可能产生最好的设计.如果您为每个主要的设计决策考虑多个选项,您将得到一个更好的结果:设计两次. 假设您正在为GUI文本编辑器设计管理文件文 ...

  8. 《Redis设计与实现》第4章 字典

    目录​​​​​​​ 第4章 字典 4.1 字典的实现 4.2 哈希算法 4.3 解决键冲突 4.4 rehash 4.5 渐进式reha

  9. 《redis 设计与实现》读书笔记

    大家好,我是烤鸭:     <redis 设计与实现>,读书笔记. 第一部分 数据结构与对象 第2章 简单动态字符串 Redis 使用SDS 作为字符串表示. O(1) 复杂度获取字符串长 ...

  10. 《redis设计与实现》 读书笔记

    <redis设计与实现> 作者:黄健宏 读书笔记 一.前言 什么是redis: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数 ...

最新文章

  1. 我的postfix过滤邮件、群发邮件问题 跟某云平台的故事
  2. 最详细易懂的CRC-16校验原理(附源程序)
  3. 北京内推 | ​百度自然语言处理部内容理解方向招收NLP算法实习生
  4. net clr via c sharp chap1-- note
  5. redis -cli command not found_记一次 Linux 服务器 redis 漏洞分析
  6. # 异运算_小学数学运算三要点:定律、法则与顺序(解析)
  7. raml2html 安装,Raml实践
  8. 递归,yield,参数槽
  9. 简单的angular表单验证指令
  10. 神策应用-概述认知(一)
  11. 怎么实现类似星星闪烁的效果(box-shadow)
  12. Excel中的$是什么意思
  13. 使用 Abp.Zero 搭建第三方登录模块(一):原理篇
  14. 无线设置时服务器无响应怎么办,无线路由器怎么设置服务器未响应
  15. 当我们讨论“平台”,我们在说什么
  16. CS3825EO 2X25W D类功放芯片 耐压5V-26V 可替换AD52068
  17. 浅谈鸽巢原理的证明和简单应用
  18. 史上最全C++排序算法总结!!!(没有之一)
  19. git拉取远程指定分支到本地
  20. linux to go把linux系统装进U盘里随插随用

热门文章

  1. android studio module不识别 红色j,androidstudio 不显示 Module-- 新年第一波
  2. php pdo 怎么循环,php – 在循环内绑定PDO语句的参数
  3. 手动更改oracle监听,详解Oracle数据库手动注册监听的方法
  4. android前台服务需要解绑,Android接入
  5. div自动滚动_实现图片自动和手动切换的编程技巧
  6. c++ :静态函数的应用
  7. 【模型解读】GoogLeNet中的inception结构,你看懂了吗
  8. 全球及中国木材加工行业运行状况与投资产值预测报告2022版
  9. 自己实现spring核心功能 二
  10. 单链表反转的原理和python代码实现