当前位置: 首页 > news >正文

【Redis】Redis 持久化 AOF、RDB—(七)

目录

    • 一、AOF 日志
    • 二、RDB 内存快照

在这里插入图片描述
在这里插入图片描述
Redis 一旦服务器宕机,内存中的数据将全部丢失,从后端数据库恢复这些数据,对数据库压力很大,且性能肯定比不上从 Redis 中读取,会拖慢应用程序。所以,对 Redis 来说,实现数据的 持久化 ,避免从后端数据库中进行恢复,是至关重要的。

一、AOF 日志

AOF 日志是先执行命令,把数据写入内存,然后才记录日志以文本形式保存,如下图:“*3” 表示命令有三个部分组成,每部分由"$+数字"开头,“$3 set"表示这部分有三个字节,指"set"命令,”$7 testkey"表示该部分有七个字节,即"testkey"命令,以此类推。
在这里插入图片描述

AOF 写后日志只有命令能执行成功,才会被记录到日志中,避免额外的检查开销,也避免了出现记录错误命令的情况,而且不会阻塞当前的写操作。说完 优点 说 风险 ,如果刚执行完命令还没有来得及记日志就宕机了,就有丢失的风险。其次,AOF 日志在主线程中执行,如果在把日志文件写入磁盘压力过大,可能会带来阻塞风险。

AOF 风险与写回磁盘有关,针对这个问题提供了三种 写回策略 ,即配置项 appendfsync 的三个可选值:

  • (1)Always 同步写回:每个写命令执行完,立马同步地将日志写回磁盘
  • (2)Everysec 每秒写回:每个写命令执行完,先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘
  • (3)No 操作系统控制的写回:每个写命令执行完,先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘

三种策略各有优劣,汇总如下:
在这里插入图片描述

选定写回策略,并非万事大吉,随着接收的写命令越来越多,AOF 文件会越来越大,带来性能问题。主要是以下三个方面:

  • (1)文件系统本身对文件大小有限制,无法保存过大的文件

(2)如果文件太大,之后再往里面追加命令记录的话,效率也会变低

  • (3)如果发生宕机,AOF 中记录的命令要一个个被重新执行,文件太大导致整个恢复过程就会非常缓慢,影响 Redis 正常使用

日志文件太大了怎么办呢?这个时候,AOF 重写机制 就登场了。当一个键值对被多条写命令反复修改时,AOF 文件会记录相应的多条命令,而重写时,只会根据这个键值对当前的最新状态,为它生成对应的写入命令,这样一来,一个键值对在重写日志中只用一条命令就行了,并且在日志恢复时,只用执行这条命令,就可以直接完成这个键值对的写入了。举个栗子:
在这里插入图片描述

AOF 重写并不会阻塞主线程,重写过程是由后台线程 bgrewriteaof 来完成的,通过内存拷贝和两处日志保证数据的完整性。
在这里插入图片描述

二、RDB 内存快照

内存快照 RDB 就是 Redis DataBase 的缩写,和 AOF 相比,RDB 记录的是某一时刻的数据,并不是操作,所以在做数据恢复时,我们可以直接把 RDB 文件读入内存,很快地完成恢复。但同时也面临两个问题:

  • (1)对哪些数据做快照?这关系到快照的执行效率问题。
  • (2)做快照时,数据还能被增删改吗?这关系到 Redis 是否被阻塞,能否同时正常处理请求。

为了提供所有数据的可靠性保证,全量快照会把内存中的所有数据都记录到磁盘中,一个都不少。这样会花费很多时间,全量数据越多,RDB 文件就越大,往磁盘上写数据的时间开销就越大。对于 Redis 而言,它的单线程模型就决定了,我们要尽量避免所有会阻塞主线程的操作。Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave:

  • (1)save:在主线程中执行,会导致阻塞。
  • (2)bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。

bgsave 避免主线程阻塞,可以正常接收请求,但是,为了保证快照完整性,它只能处理读操作,不能修改正在执行快照的数据。Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。示意如图:
在这里插入图片描述
简单来说,主线程 fork 生成 bgsave 子进程,可共享主线程的所有内存数据。bgsave 子进程运行读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读操作(例如图中的键值对 A),则主线程和子进程互不影响。如果主线程要修改数据(例如图中的键值对 C),则会生成该数据的副本,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

至此上面提的两个问题“哪些数据做快照”、“做快照时数据能否修改”就都解决了。新的问题又产生了,快照间隔多久做一次合适?如果在第二次快照前宕机,就可能出现数据丢失的问题,如果太频繁又会出现第一个还没结束,第二个又开始的情况。虽然 bgsave 执行时不阻塞主线程,但是,如果频繁地执行全量快照,也会给磁盘带来额外的开销,并且 bgsave 子进程需要通过 fork 操作从主线程创建出来,频繁操作依然会阻塞主线程。

此时,增量快照就登场了,做了一次全量快照后,后续的快照只对修改的数据进行快照记录,这样可以避免每次全量快照的开销。比如 T1 和 T2 时刻如果再做快照,我们只需要将被修改的数据写入快照文件就行。
在这里插入图片描述
虽然我们记住哪些数据被修改了,但“记住”这个操作,需要我们使用额外的元数据信息去记录,这会带来额外的空间开销问题。有时改动较小时,又要引入的额外空间区记录,有些得不偿失。此时我们就可以混合使用 AOF 日志和内存快照的方法,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。

在这里插入图片描述
如图,T1 和 T2 时刻的修改,用 AOF 日志记录,在第二次做全量快照时,就可以清空 AOF 日志,因为修改都已经记录到快照中了。这个方法既能享受到 RDB 文件快速恢复的好处,又能享受到 AOF 只记录操作命令的简单优势,可谓鱼和熊掌兼得。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VS2019开发CAN上位机
  • 【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题
  • golang gin template模板渲染
  • 【Python报错已解决】`SyntaxError: can‘t assign to function call`
  • YOLOv9改进策略【模型轻量化】| ShufflenetV2,通过通道划分构建高效网络
  • 基于matlab的行人和车辆检测系统
  • 模型 ACT心理灵活六边形
  • 不同浏览器JS对数组末尾多余的逗号的处理
  • AUTOSAR_EXP_ARAComAPI的5章笔记(1)
  • 八皇后问题代码实现(java,递归)
  • 选科组合(入门)
  • 微信陷阱丨警惕“间谍网勾”的迷魂汤
  • nginx部署前端vue项目
  • Python | Leetcode Python题解之第387题字符串中的第一个唯一字符
  • Spring之配置类解析源码解析
  • 网络传输文件的问题
  • 3.7、@ResponseBody 和 @RestController
  • 5、React组件事件详解
  • CSS盒模型深入
  • Java方法详解
  • leetcode-27. Remove Element
  • markdown编辑器简评
  • python docx文档转html页面
  • React-flux杂记
  • ReactNative开发常用的三方模块
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 今年的LC3大会没了?
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 强力优化Rancher k8s中国区的使用体验
  • 正则表达式小结
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 回归生活:清理微信公众号
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​iOS安全加固方法及实现
  • # 达梦数据库知识点
  • # 计算机视觉入门
  • #pragma pack(1)
  • (003)SlickEdit Unity的补全
  • (20050108)又读《平凡的世界》
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (独孤九剑)--文件系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (四)模仿学习-完成后台管理页面查询
  • (转)大道至简,职场上做人做事做管理
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (自用)gtest单元测试
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算