【Redis】持久化机制最全解析

news2024/9/26 5:19:35

RDB持久化

RDB全称Redis Database Backup file(Redis数据备份文件)。通过将Redis数据集的快照保存到磁盘上的二进制文件中来实现。生成 RDB 文件的过程可以通过手动命令或自动触发。

实现原理

开始 BGSAVE

  • Redis 主进程接收到 BGSAVE 命令后,调用 fork 创建一个子进程,子进程会先复制主进程的页表(记录虚拟地址与物理地址的映射关系),而不是立即复制实际的内存数据。
  • 在 fork 完成后,父子进程共享相同的内存页,子进程负责生成 RDB 文件,主进程可以继续处理客户端请求。

生成 RDB 文件

  • 子进程根据页表,扫描 Redis 数据集,将每个键值对序列化为二进制格式,并写入到临时 RDB 文件中。
  • 序列化后的数据被写入到一个临时 RDB 文件中,以避免影响现有 RDB 文件的使用。
  • 写时复制(Copy-On-Write, COW)
    • 在生成 RDB 文件的过程中,如果主进程执行了写操作(如插入、更新、删除数据),操作系统会触发写时复制机制。COW 机制会为被修改的内存页创建一个副本,并将写操作应用到这个副本上,而不是直接修改共享的内存页。
    • 主进程在读取被修改的数据时,会从生成的副本中读取,而子进程则继续读取原始的内存页。这种机制确保了子进程在生成 RDB 文件时看到的是一致且稳定的数据快照,而主进程可以不受影响地继续处理新的写操作。

完成 RDB 文件

  • 子进程生成 RDB 文件后,将临时 RDB 文件重命名为正式的 RDB 文件,确保文件替换过程是原子的。

手动启用

Redis 提供了以下两个命令来手动生成 RDB 快照文件:

save # 同步保存操作,由Redis主进程来执行RDB,会阻塞所有命令
bgsave # 开启子进程执行RDB,避免主进程受到影响

这里说 Redis 主线程而不是主进程的主要是因为 Redis 启动之后主要是通过单线程的方式完成主要的工作。如果你想将其描述为 Redis 主进程,也没毛病。

定时启用

可以通过配置文件中的 save 选项进行定时触发RDB持久化。

save 900 1	#900(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 300 10	#300(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 60 10000	#60(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命

AOF持久化

AOF全称为Append Only File(追加文件)。通过将每次写操作记录到AOF文件中来实现。这种方式的特点是将 Redis 接收到的每个写命令都追加到文件末尾。

实现原理

AOF 持久化功能的实现可以简单分为 5 步:

  1. 命令追加(append):所有的写命令会追加到 AOF 缓冲区中。
  2. 文件写入(write):将 AOF 缓冲区的数据写入到 AOF 文件中。这一步需要调用write函数(系统调用),write将数据写入到了系统内核缓冲区之后直接返回了(延迟写)。
  3. 文件同步(fsync):AOF 缓冲区根据对应的持久化方式( fsync 策略)向硬盘做同步操作。这一步需要调用 fsync 函数(系统调用), fsync 针对单个文件操作,对其进行强制硬盘同步,fsync 将阻塞直到写入磁盘完成后返回,保证了数据持久化。
  4. 文件重写(rewrite):随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  5. 重启加载(load):当 Redis 重启时,可以加载 AOF 文件进行数据恢复。

启用AOF

与快照持久化相比,AOF 持久化的实时性更好。默认情况下 Redis 没有开启 AOF(Redis 6.0 之后默认开启),可以通过 appendonly 参数开启:

# 是否开启AOF,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

刷盘策略

开启 AOF 持久化后,每执行一条会更改 Redis 中数据的命令,Redis 就会将该命令写入到 AOF 缓冲区 server.aof_buf 中,然后再写入到系统内核缓冲区中,最后根据刷盘策略的配置来决定何时将系统内核缓冲区中的数据同步到硬盘中。

AOF的命令记录的频率也可以通过redis.conf文件来配置。

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
#写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到A0F文件,是默认方案
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
配置项刷盘时机优点缺点
always同步刷盘可靠性高,几乎不丢数据性能影响大
everysec每秒刷盘性能适中最多丢失1秒数据
no操作系统控制性能最好可靠性较差,可能丢失大量数据

文件重写

随着时间的推移,AOF 文件会因为不断追加写命令而变得越来越大,可能会导致磁盘空间不足和恢复速度变慢。可以通过重新生成一个新的 AOF 文件,将当前的数据集以最少的命令集记录下来,从而缩小文件大小

AOF 文件重写期间,Redis 还会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新 AOF 文件期间,记录服务器执行的所有写命令。当子进程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新的 AOF 文件保存的数据库状态与现有的数据库状态一致。最后,服务器用新的 AOF 文件替换旧的 AOF 文件,以此来完成 AOF 文件重写操作。

开启 AOF 重写功能,可以调用 bgrewriteaof 命令手动执行,也可以设置阈值进行自动执行。

  • auto-aof-rewrite-min-size:如果 AOF 文件大小小于该值,则不会触发 AOF 重写。默认值为 64 MB
  • auto-aof-rewrite-percentage:执行 AOF 重写时,当前 AOF 大小和上一次重写时 AOF 大小的比值。如果当前 AOF 文件大小增加了这个百分比值,将触发 AOF 重写。将此值设置为 0 将禁用自动 AOF 重写。默认值为 100。

AOF校验机制了解吗

AOF 校验机制是 Redis 在启动时对 AOF 文件进行检查,以判断文件是否完整,是否有损坏或者丢失的数据。

这个机制的原理其实非常简单,就是通过使用一种叫做 校验和(checksum) 的数字来验证 AOF 文件。这个校验和是通过对整个 AOF 文件内容进行 CRC64 算法计算得出的数字。如果文件内容发生了变化,那么校验和也会随之改变。因此,Redis 在启动时会比较计算出的校验和与文件末尾保存的校验和(计算的时候会把最后一行保存校验和的内容给忽略掉),从而判断 AOF 文件是否完整。如果发现文件有问题,Redis 就会拒绝启动并提供相应的错误信息。

类似地,RDB 文件也有类似的校验机制来保证 RDB 文件的正确性,这里就不重复进行介绍了。

如何选择RDB和AOF

RDB(Redis Database File)

优点:

  1. 持久化速度快:RDB 文件在持久化时会生成一个数据快照,可以快速地恢复大规模的数据集。
  2. 文件较小:RDB 文件是二进制格式的,通常比 AOF 文件更小,占用的磁盘空间较少。
  3. 恢复速度快:RDB 文件在恢复数据时,加载速度通常比 AOF 快,因为 RDB 文件是一个完整的数据快照,不需要逐条回放写操作。
  4. 对性能影响小:RDB 持久化是通过子进程完成的,主进程可以继续处理客户端请求,因此对 Redis 性能影响较小。

缺点:

  1. 数据丢失风险高:因为 RDB 持久化是定期执行的(如每隔几分钟或根据配置的触发条件),在上一次持久化到下一次持久化之间的数据可能会丢失。
  2. 生成过程消耗资源:生成 RDB 文件需要 fork 子进程并占用一定的 CPU 和内存资源,特别是数据量大时会影响性能。

AOF(Append-Only File)

优点:

  1. 数据丢失风险低:AOF 通过追加日志记录每次写操作,可以更频繁地持久化数据(甚至可以做到每秒持久化一次),因此数据丢失的风险较低。
  2. 可调的同步策略:AOF 提供了多种同步策略(如 alwayseverysecno),可以根据需要在性能和数据安全性之间做权衡。
  3. 更人性化:AOF 文件是可读的日志文件,方便人类阅读和分析,有助于调试和故障排查。

缺点:

  1. 文件较大:AOF 文件记录了每个写操作,文件大小通常比 RDB 大很多,占用更多的磁盘空间。
  2. 恢复速度慢:AOF 恢复数据时需要回放所有的写操作日志,恢复速度通常比 RDB 慢。
  3. 性能开销较大:因为 AOF 需要在每次写操作后追加日志,频繁的磁盘 I/O 操作会带来一定的性能开销,特别是在同步策略设置为 always 时。

综合比较

  1. 数据安全性:AOF 提供更高的数据安全性,适用于对数据丢失敏感的场景;RDB 在数据持久化频率较低时有较高的数据丢失风险。
  2. 性能:RDB 对 Redis 性能影响较小,适用于性能要求高的场景;AOF 因为频繁的磁盘 I/O 操作,对性能有一定的影响。
  3. 恢复速度:RDB 恢复速度更快,适用于需要快速恢复大规模数据集的场景;AOF 需要回放日志,恢复速度较慢。
  4. 磁盘空间:RDB 文件较小,节省磁盘空间;AOF 文件较大,占用更多磁盘空间。

混合持久化

Redis 4.0 引入了混合持久化机制,结合了 RDB 和 AOF 的优点,以提高持久化的效率和可靠性。混合持久化在重启恢复数据时使用 RDB 文件的快照来快速加载数据,并且将 AOF 日志应用于此快照以实现更高的数据恢复精度。

工作原理

  1. RDB 快照
    • Redis 生成 RDB 文件快照,保存整个数据库的二进制数据。
    • RDB 文件的生成是通过子进程完成的,主进程可以继续处理客户端请求。
  2. AOF 日志
    • 除了生成 RDB 文件外,Redis 还会将写操作记录到 AOF 日志中。
    • 在混合持久化模式下,AOF 文件的初始部分是一个 RDB 快照,后面紧接着的是增量的 AOF 日志。
  3. 持久化过程
    • 当 Redis 进行持久化操作时,它会首先生成一个 RDB 文件,并将这个文件内容写入 AOF 文件。
    • 在 AOF 文件中,RDB 文件的内容作为初始部分,然后紧跟着追加的 AOF 日志。
  4. 数据恢复
    • 当 Redis 重启时,它会首先加载 AOF 文件中的 RDB 部分(即快照)来快速恢复数据。
    • 然后,它会回放 AOF 文件中 RDB 部分后的增量日志,以确保数据的一致性和完整性。

优缺点

优点:

  1. 快速恢复:使用 RDB 部分可以快速加载大部分数据,而不需要逐条回放所有写操作日志,极大地提高了数据恢复的速度。
  2. 较高的数据安全性:结合了 RDB 和 AOF 的优点,RDB 部分确保了数据的快速恢复,而 AOF 部分提供了更高的数据持久化频率,降低了数据丢失的风险。
  3. 性能优化
    • 在持久化过程中,RDB 快照的生成是通过子进程完成的,对主进程处理客户端请求的性能影响较小。
    • AOF 的增量日志记录了自上次快照以来的所有写操作,减少了持久化过程中的 I/O 操作次数,提高了系统性能。

缺点:

  1. 配置复杂性:混合持久化的配置比单独使用 RDB 或 AOF 更加复杂,需要合理设置参数以实现最佳性能和数据安全性。
  2. 磁盘空间占用:混合持久化模式下,AOF 文件既包含 RDB 快照部分又包含增量日志,可能会占用更多的磁盘空间。

启用混合持久化

要启用混合持久化,可以在 Redis 配置文件 redis.conf 中设置以下参数:

# 启用 AOF 持久化
appendonly yes

# AOF 重写策略
# 在 AOF 文件达到指定大小或比例时触发重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 启用混合持久化
aof-use-rdb-preamble yes
s.conf` 中设置以下参数:

```shell
# 启用 AOF 持久化
appendonly yes

# AOF 重写策略
# 在 AOF 文件达到指定大小或比例时触发重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 启用混合持久化
aof-use-rdb-preamble yes

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】五、树:2.二叉树(完全二叉树、前中后序遍历)

二、二叉树Binary tree 文章目录 二、二叉树Binary tree1.逻辑结构1.1斜树1.2满二叉树❗1.3完全二叉树1.4排序二叉树BST1.5平衡二叉树AVL1.6线索二叉树 2.性质3.存储结构3.1顺序存储3.2链式存储 4.遍历4.1前序遍历4.1.1前序非递归方式 4.2中序遍历4.2.1中序非递归方式 4.3后序遍…

java 解析 PDF OFD 发票 部分文字缺失

1、pdfbox https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox 到这里用最新的版本 最近碰到发票各式各样,千奇百怪:记录其中一个 解析出来是:缺少一个通字 发票好几处都缺少文字,解析出来的是 一个 圆点 原因&…

赋能未来园区:TSINGSEE视频AI智能管理平台如何引领园区管理智慧化转型

一、建设背景 随着经济的不断发展,园区产业集聚发展已成为趋势,园区逐渐成为产业聚集的重要载体。目前,国内现有的大部分园区的管理方式比较粗放、单一,范围局限于安全、环境等方面且不成体系,并且没有覆盖到应急、消…

计算机网络408考研 2014

1 计算机网络408考研2014年真题解析_哔哩哔哩_bilibili 1 111 1 11

电脑怎么格式化清除所有数据

在出售、捐赠或维修电脑之前或需要处理敏感数据时,格式化硬盘并彻底清除所有数据还是很有必要的。本篇文章将详细介绍如何安全、彻底地格式化你的电脑。 一、准备工作 在开始格式化之前,有一些重要的准备工作需要完成。这些步骤为了能帮你顺利进行格式化…

Java并发编程——线程创建的4种常见方式

文章目录 一、继承 Thread 类创建创建线程类1.1 Thread 类解析1.2 使用方法1.3 优缺点 二、实现 Runable 接口创建线程类2.1 Runable 接口解析2.2 使用方法2.3 优缺点 三、使用 Callable 和 FutureTask 创建线程3.1 Callable 接口解析3.2 RunnableFuture 接口解析3.3 Future 接…

CV/NLP【面经】

CV/NLP【面经】 1x1conv的作用多头注意力与普通注意力的区别:过拟合怎么解决随机森林和GBDT的区别决策树是怎么做回归任务的注意力机制参数量和计算量 1x1conv的作用 1.首先我们需要明确卷积的输入输出不是一个平面,而是一个长方体。所以1x1conv实际上对…

CTFHUB-web-RCE-命令注入

开启题目 检查网页显示内容,可以直接看到源代码。大致意思是:检查用户输入的 GET 请求,判断用户是否输入了 ip 信息。如果输入了 ip 信息,则使用用户输入的这个 ip 数据执行一个 shell 命令 "ping -c 4" 。 在输入框中…

C语言----用指针数组构造字符串数组

用指针数组构造字符串数组 实例说明: 本实例实现输入一个星期中对应的第几天,可显示其英文写法。例如,输入“4”,则显示星期四所对应的英文名。 实现过程: (1)打开 Visual C 6.0开发环境,新建一个C源文件…

【Matlab】零阶保持法:连续状态空间方程(含噪声,非线性)离散化处理方法

常用的离散化方法:零阶保持器(zero-order hold,ZOH)、欧拉法(Euler)、一阶保持器(First-order hold,FOH)。最常用的是前两种。 0.零阶保持器(ZOH&#xff09…

软文写作必须掌握的技巧有哪些?

现代互联网飞速发展的时代,硬广逐渐变的效果越来越差,而软文推广已经成为网络营销的重要组成部分了,一篇好的软文往往能为你的产品、网站带来意想不到的效果。 用于做营销的软文,我们不能像写普通文章那样随意。一篇优质的软文会让…

AI面试:未来招聘的新常态?

一、引言:招聘变革的序章 在数字化浪潮的推动下,各行各业正经历着前所未有的变革,而人力资源管理作为企业发展的核心驱动力之一,也迎来了其转型升级的关键时刻。传统招聘流程中,简历筛选、初步面试、复试乃至终面&…

AI的IDE:Cursor配置虚拟python环境(conda)

AI的IDE:Cursor配置虚拟python环境(conda) Cursor是一个AI的IDE,是从VSCode源代码中fork出来的,专注于和AI一起Coding而生。https://www.cursor.com/是官方地址。最近开始逐渐的试用Cursor,之前一直是VSCod…

vue3数字动画插件countup.js

countup.js 是一个轻量级的 JavaScript 库,允许你为网站上显示统计数据或计数器时平滑地动画化数字。CountUp 类被用来创建计数器实例,可以平滑地从一个数值变化到另一个数值。 只是用户视觉更好一些。 1、安装插件 npm i countup.js2、个人是封装了组件…

前端性能优化-用户交互体验优化

前言 本文总结一些常见的用户交互体验优化的方法 骨架屏 使用 loading 图或者是骨架屏,可以一定程度上减少用户等待加载的焦虑感,让用户感觉没有等太久,这就是用户体验级的优化。 PS: 可以利用 webpack 实现骨架屏的自动生成 图…

Grafana动态视图在转转推送系统中的应用

1 背景 转转的推送系统为自研产物,实现过程简述为:对外提供一个接入层,以多次MQ转发形式进行多系统交互,内部包括:推送内容过滤、免打扰策略、厂商通道分发等逻辑,最终发起http请求至厂商通道,…

【Android Studio】新new UI老UI的切换

Android studio新版UI 风格和老版本风格切换: File-> Settings-> Appearance-> New UI-> Enable NewUI选项

人工智能大模型如何引领智能时代的革命?

人工智能大模型如何引领智能时代的革命? 人机交互革命:大模型如何提升我们与机器沟通的自然性和智能化程度?计算范式革命:大模型如何影响现有的计算模式,并推动新一代计算技术的演进?认知协作革命&#xff…

海南云亿商务咨询有限公司洞察抖音电商新趋势

在当今这个数字化浪潮汹涌的时代,抖音电商以其独特的魅力,正逐步成为企业转型升级、品牌破圈的重要阵地。而在这片充满机遇与挑战的蓝海中,海南云亿商务咨询有限公司犹如一颗璀璨的新星,凭借其专业的服务能力和敏锐的市场洞察&…

SQL手工注入

目录 1.判断是否存在sql注入点 1.1我们在地址栏中输入?id1 1.2我们在地址栏中输入?id-- 2.联合查询 2.1首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。 2.2爆出显示位,就是看看表格里面哪一列是在页面显示…