(七)Redis 持久化 AOF、RDB

news/2024/9/20 3:28:08/文章来源:https://www.cnblogs.com/WinterSir/p/18085397

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

1、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 来完成的,通过内存拷贝和两处日志保证数据的完整性。

2、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 只记录操作命令的简单优势,可谓鱼和熊掌兼得。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/781594.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 渲染卡顿的几个问题

1.渲染时禁止使用 uni.getStorageSync。会卡顿2.做大量的浮点运算。数据类型转换等。能先算好的就算好。

观存储历史,论数据未来

在探索未来的数据存储技术时,我们不禁感慨于人类智慧的无限可能。从古代的竹简、木简,到蔡伦的造纸术,再到现代的机械硬盘、固态硬盘,直至云存储和前沿的DNA存储与量子存储,技术的演进总是令人惊叹。历史告诉我们,在时间面前,所有不可逾越的技术壁垒都是纸老虎。对于程序…

洛谷题单指南-前缀和差分与离散化-P5937 [CEOI1999] Parity Game

原题链接:https://www.luogu.com.cn/problem/P5937 题意解读:已知长度为n的01序列,给出m个判断,每个判断认为l~r之间1的个数是偶数或者奇数,计算前多少个判断是正确的。 解题思路: 先用前缀和思想来思考本题:假设s[i]是序列前i个数的和 对于每一个判断,有两种可能 第一…

深入理解 PHP 高性能框架 Workerman 守护进程原理

守护进程顾名思义就是能够在后台一直运行的进程,不会霸占用户的会话终端,脱离了终端的控制。相信朋友们对这东西都不陌生了吧?如果连这个概念都还不能理解的话,建议回炉重造多看看 Linux 进程管理相关的基础知识。大家好,我是码农先森。 守护进程顾名思义就是能够在后台一…

IT基础书籍汇集_sum

希望STUDENT过软考,所以有些基础书籍还是需要看看 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------虽然书籍,标注“著”的书籍…

antd表单的<a-form-item>使用自定义label插槽

item的label类型可以使字符串或者自定义label插槽。 1.直接使用字符串类型是最常见的<a-form-model-item prop="job" label="岗位"><a-input v-model="job" placeholder="请输入岗位" /> </a-form-model-item> 2.自…

Nexpose v6.6.264 for Linux Windows - 漏洞扫描

Nexpose v6.6.264 for Linux & Windows - 漏洞扫描Nexpose v6.6.264 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Aug 07, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:…

二、Linux系统安装和基本使用

Linux系统安装和基本使用 这里我想记录自己在学习中遇到的有趣的、让自己觉得学到了的点。 Vim的使用 文章中举出的两个git power的例子非常有意思,我们来分析一下: 宏录制The first example is to generate the following file:1 2 3 ..... 98 99 100This file contains 100…

Java学习笔记2--JDK的安装和配置

一.进入oracle官网,下载jdk oracle官网:Oracle | Cloud Applications and Cloud Platform ps:不同的浏览器,可能进入oracle官网,会只显示部分内容,所以建议使用google Chrome浏览器在下载之前,首先需要去查看本机电脑的配置型号,如下图,右键---此电脑---选择点击属性,…

Markdown指定图片比例

编写Markdown文档时,有时候直接插入的文档,并没有按照预想的比例出现,这个时候可以手动调整其比例,具体参考: <img src="C:\Users\admin\Pictures\your_pic.png" alt="pic_name" style="zoom:30%" >

Blazor开发框架Known-V2.0.7

V2.0.7 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行。官网:http://known.pumantech.com Gitee: https://gitee.com/known/Known Github:https://github.com/known/Known概述基于C#和Blazor的快速开发框架,开箱即用,跨平台。 模…

当 Spring 循环依赖碰上 Aysnc,调试过程中出现 BeanCurrentlyInCreationException,有点意思

开心一刻 前两天有个女生加我,我同意了 第一天,她和我聊文学,聊理想,聊篮球,聊小猫小狗 第二天,她和我说要看我腹肌 吓我一跳,我反手就删除拉黑,我特喵一肚子的肥肉,哪来的腹肌!循环依赖 关于 Spring 的循环依赖,我已经写了 4 篇Spring 的循环依赖,源码详细分析 →…