一文彻底搞懂Redis持久化

news2024/12/21 4:20:56

文章目录

  • 1. Redis持久化方式
  • 2. RDB(快照)
    • 2.1 手动方式
    • 2.2 自动方式
    • 2.3 何时触发 RDB 持久化
    • 2.4 RDB 相关配置
  • 3. AOF(追加日志文件)
    • 3.1 AOF 文件解读
    • 3.2 AOF 的写入与同步
    • 3.3 AOF 重写
    • 3.4 AOF 重写面临的问题
    • 3.5 AOF相关配置
  • 4. 混合持久化

1. Redis持久化方式

Redis持久化是指将Redis服务器中的数据保存到磁盘上,以防止数据在服务器重启时丢失。Redis提供了两种主要的持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。这两种持久化方式可以分别或同时使用,以满足不同的需求和场景。Redis持久化不保证数据的完整性,有可能会丢数据。当Redis用作DB时,DB数据要完整,所以一定要有一个完整的数据源(文件、mysql),在系统启动时,从这个完整的数据源中将数据load到Redis中。
在这里插入图片描述

  • RDB:RDB文件是一个经过压缩的二进制文件。
  • AOF:AOF则是以追加的方式记录Redis执行的每一条写命令。

2. RDB(快照)

RDB 是 Redis 默认的持久化方式,它将 Redis 在内存中的数据写入到硬盘中,生成一个快照文件。这个快照文件是一个二进制文件,包含了 Redis 在某个时间点内的所有数据。

RDB 文件以二进制格式保存,因此非常紧凑,并且在 Redis 重启时可以快速加载数据。相比于 AOF,通常情况下 RDB 文件会更小。

RDB 的优点在于快速、简单,适用于大规模数据备份和恢复。然而,RDB 也存在一些缺点,其中一个主要缺点是数据可能会丢失。因为 Redis 只会在指定的时间点生成快照文件,如果在快照文件生成之后,但在下一次快照文件生成之前服务器宕机,那么这期间的数据就会丢失。

RDB 持久化可以通过两种方式触发:手动和自动。

  • 手动方式是通过 SAVE 命令或 BGSAVE 命令触发的。
  • 自动方式则是在 Redis 配置文件中设置触发条件,当满足条件时自动触发持久化操作。

2.1 手动方式

手动触发 RDB 持久化可以通过 SAVE 命令或 BGSAVE 命令来完成。

  • SAVE 命令:SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 快照文件创建完毕为止。在创建 RDB 文件期间,Redis 服务器不能处理其他命令请求。因此,SAVE 命令会造成阻塞,不适合在生产环境中频繁使用。

  • BGSAVE 命令:BGSAVE 命令会在后台异步执行 RDB 持久化操作,不会阻塞 Redis 服务器进程,因此可以在不影响正常命令处理的情况下生成 RDB 文件。这是推荐的手动触发持久化方式。使用 BGSAVE 命令时,Redis 会创建一个子进程来执行持久化操作,主进程继续处理命令请求。

2.2 自动方式

自动触发 RDB 持久化可以通过设置 Redis 配置文件中的参数来实现。主要有两个参数控制自动触发 RDB 持久化的条件:

  • save 参数:save 参数用于配置自动触发 RDB 持久化的条件。它接受一组数字参数,每个数字参数包含两个值:时间和修改次数。当满足任一组条件时,Redis 将执行 RDB 持久化操作。
save <seconds> <changes>

例如,save 900 1 表示在 900 秒内,如果至少有 1 个键被修改,则触发 RDB 持久化。

  • stop-writes-on-bgsave-error 参数:stop-writes-on-bgsave-error 参数用于配置当 RDB 持久化失败时是否停止写入操作。设置为 yes 表示在 RDB 持久化失败时停止写入操作,设置为 no 表示即使 RDB 持久化失败也继续写入操作。
stop-writes-on-bgsave-error yes

在 Redis 的配置文件中,您可以根据具体需求配置这些参数。例如:

save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes

上述配置表示:

  • 在 900 秒内,如果至少有 1 个键被修改,则触发 RDB 持久化。
  • 在 300 秒内,如果至少有 10 个键被修改,则触发 RDB 持久化。
  • 在 60 秒内,如果至少有 10000 个键被修改,则触发 RDB 持久化。
  • 如果 RDB 持久化失败,则停止写入操作。

2.3 何时触发 RDB 持久化

Redis 服务器内部维护了一个计数器 dirty 和一个时间戳 lastsave 用于触发 RDB 持久化。Redis 判断触发 RDB 持久化的时机是在每个命令执行完成后,Redis 会检查是否满足了执行 RDB 持久化的条件。具体来说,它会在每次执行写入命令后(如 SET、DEL 等),检查以下两个条件:

  • Dirty 数据量达到阈值: Redis 会维护一个 dirty 计数器,记录自上次 RDB 持久化以来被修改的键值对的数量。当 dirty 计数器的值超过了配置的 save 选项中的 save 参数中的 阈值时,就会触发 RDB 持久化。
  • 上次 RDB 持久化时间间隔超过阈值: Redis 会记录上次执行 RDB 持久化的时间戳 lastsave。当当前时间与上次执行 RDB 持久化的时间间隔超过了配置的 save 选项中的 save 参数中的 阈值时,也会触发 RDB 持久化。

只有同时满足了上述两个条件,Redis 才会在命令执行完成后触发 RDB 持久化。

2.4 RDB 相关配置

  • save :指定 RDB 持久化操作的条件,即在指定的时间间隔内(seconds)内有多少次写操作(changes)触发 RDB 快照的保存。
  • stop-writes-on-bgsave-error:指定在 RDB 持久化过程中如果出现错误是否停止写入操作。如果设置为 yes,当 Redis 在执行 RDB 操作时遇到错误时,Redis 将停止接受写入操作;如果设置为 no,Redis 将继续接受写入操作。
  • rdbcompression:指定是否对 RDB 文件进行压缩。如果设置为 yes,Redis 会在生成 RDB 文件时对其进行压缩,从而减少磁盘占用空间;如果设置为 no,Redis 不会对生成的 RDB 文件进行压缩。
  • rdbchecksum:指定是否对 RDB 文件进行校验和计算。如果设置为 yes,在保存 RDB 文件时,Redis 会计算一个 CRC64 校验和并将其追加到 RDB 文件的末尾;在加载 RDB 文件时,Redis 会对文件进行校验和验证,以确保文件没有受到损坏或篡改。
  • repl-diskless-sync:这是 Redis 2.8 中引入的一个配置项,用于指定复制节点在进行初次全量同步(即从主节点获取全部数据)时是否采用无盘同步方式。当设置为 yes 时,复制节点将通过网络直接获取主节点的数据,并且不会将数据存储到本地磁盘中;当设置为 no 时,复制节点将先将主节点的数据保存到本地磁盘中,然后再进行同步操作。采用无盘同步方式可以避免磁盘 IO 操作对系统性能的影响,但同时也会增加网络负载和内存占用。
  • replica-serve-stale-data:这是 Redis 4.0 中新增的一个配置项,用于指定复制节点在与主节点断开连接后是否继续向客户端提旧数据。当设置为 yes 时,在复制节点与主节点断开连接后,该节点将继续向客户端提供旧数据,直到重新连接上主节点并且同步完全新的数据为止;当设置为 no 时,复制节点会立即停止向客户端提供数据,并且等待重新连接上主节点并同步数据。需要注意的是,当 replica-serve-stale-data 设置为 yes 时,可能会存在一定的数据不一致性问题,因此建议仅在特定场景下使用。

3. AOF(追加日志文件)

AOF(Append Only File)持久化是按照 Redis 的写命令顺序将写命令追加到磁盘文件的末尾,是一种基于日志的持久化方式,它保存了 Redis 服务器所有写入操作的日志记录。

AOF 的核心思想是将 Redis 服务器执行的所有写命令追加到一个文件中。这样做的好处是可以保证数据的完整性,当Redis服务器重新启动时,可以通过重新执行 AOF 中的命令来恢复服务器的状态,使其数据与写入时保持一致。
在这里插入图片描述

3.1 AOF 文件解读

一个简单的 AOF 文件示例如下:
在这里插入图片描述

这个文件展示了两条命令:

select 0
set k1 hello

其中:

  • *号:表示参数个数,后面紧跟着参数的长度和值。
  • $号:表示参数长度,后面紧跟着参数的值。

AOF文件中保存的所有命令都遵循相同的格式,即以*开头表示参数个数,$开头表示参数长度,其后紧跟着参数的值。

AOF有个比较好的优势是可以恢复误操作,如果你不小心执行了 FLUSHALL 命令,导致数据被误删,但只要 AOF 文件未被重写,那么只要停止服务器,移除 AOF 文件末尾的 FLUSHALL 命令,并重启 Redis,就可以将数据集恢复到 FLUSHALL 执行之前的状态。

3.2 AOF 的写入与同步

在这里插入图片描述

当启用 AOF 时,Redis 发生写命令时其实并不是直接写入到AOF 文件,而是将写命令追加到AOF缓冲区的末尾,之后 AOF缓存区再同步至 AOF文件中。
而 AOF 缓存区同步至 AOF 文件,这一过程由名为 flushAppendonlyFile 的函数完成。而 flushAppendOnlyFile 函数的行为由服务器配置文件的 appendfsync 选项来决定,该参数有以下三个选项:

  • always:每次发生写命令都会立即将内容同步到 AOF 文件中,这是最安全的选项,但也会带来较大的性能开销。
  • everysec:每秒钟同步一次写入操作到 AOF 文件,平衡了性能和安全性。
  • no:不主动同步写入操作到 AOF 文件,而是由操作系统来决定同步时机,这样可能会提高性能,但也增加了数据丢失的风险。

默认情况下,Redis的 appendfsync 参数为 everysec。如果需要提高持久化安全性,可以将其改为 always ,如果更关注性能,则可以将其改为 no。但是需要注意的是,使用 no 可能会导致数据丢失的风险,建议在应用场景允许的情况下谨慎使用。

3.3 AOF 重写

AOF 重写是 Redis 中的一种机制,用于解决 AOF 文件不断增长导致文件过大的问题。随着 Redis 执行写命令的增加,AOF 文件会不断增长,可能会占用大量的磁盘空间。AOF 重写机制可以重新生成一个新的 AOF 文件,该文件包含了重写期间所发生的写命令所代表的数据状态,但是文件大小会更小,同时保留了原来 AOF 文件中的所有数据。

AOF 重写是通过遍历 Redis 数据库当前的键空间来实现的。在 AOF 重写期间,Redis 会维护一个用于记录所有写命令的数据结构,然后将这些写命令按照一定的规则进行合并和优化,最终生成一个新的 AOF 文件。

AOF 重写的触发条件通常是在后台执行,并且是在满足以下条件时触发的:

  • AOF 重写至少间隔一定的时间,默认为1秒钟。
  • AOF 文件的增长尺寸超过指定的比例,默认是100%。
  • AOF 文件的增长尺寸超过指定的大小,默认是64MB。

AOF 重写机制的优点是生成的新 AOF 文件大小更小,因此可以节省磁盘空间。另外,由于 AOF 重写是在后台执行的,因此不会阻塞 Redis 的正常服务。

3.4 AOF 重写面临的问题

当子进程执行AOF重写时,父进程仍然在接收和处理新的命令,而这些新的命令可能会对数据库状态进行修改。为了解决这个问题,Redis在AOF重写期间采取了以下策略:

  • 写入同步(write-rewrite): 父进程在执行新的写入命令时,会将这些写入操作同时写入到AOF重写缓冲区,以确保重写后的AOF文件能够包含所有正在进行的写入操作。

  • 延迟重写(delayed rewrite): Redis会在父进程执行完一定数量或一定时间的写入命令后,才开始执行AOF重写操作。这样可以减少AOF重写对系统性能的影响,并尽量保证新的AOF文件与当前数据库状态一致。

  • 标记重写(rewrite marker): 在AOF重写开始之前,Redis会在AOF文件中添加一个特殊的标记,表示AOF重写的起始位置。这样在AOF重写期间,即使有新的写入命令被追加到AOF文件中,也能够确保重写后的AOF文件不会覆盖这个标记之前的部分。

通过以上策略,Redis能够在AOF重写期间尽可能地保持数据库状态的一致性,并确保生成的新AOF文件包含所有的写入操作,从而避免数据丢失和不一致的问题。

3.5 AOF相关配置

在 Redis 的配置文件 redis.conf 中,可以通过以下配置项来设置 AOF 相关参数:

  • appendonly: 用于开启或关闭 AOF,默认为关闭。若开启了 AOF,Redis 会在每次执行写命令时,将命令追加到 AOF 文件末尾。
  • appendfilename: 指定AOF文件的名称,默认为appendonly.aof。可以通过设置这个选项来指定AOF文件的文件名。
  • appendfsync: 用于控制AOF何时将缓冲区的数据同步到AOF文件中。可选值有always、everysec和no。默认值为everysec,表示每秒将缓冲区的数据同步到AOF文件中。设置为always表示每次发生写入命令都立即同步到AOF文件中,而设置为no则表示由操作系统决定何时进行同步。
  • no-appendfsync-on-rewrite: 当开启AOF重写时,如果设置了这个选项为yes,那么Redis不会对AOF文件进行同步操作。这个选项可以减少AOF重写的时候对性能的影响。
  • auto-aof-rewrite-percentage: 设置AOF文件重写时,AOF文件大小增长比例的下限,默认为100。当AOF文件的大小比上一次重写后的大小增长到这个比例以上时,会触发AOF文件的重写。
  • auto-aof-rewrite-min-size: 设置AOF文件重写时,AOF文件的最小大小,默认为64MB。只有当AOF文件的大小超过这个阈值时,才会触发AOF文件的重写。
  • aof-use-rdb-preamble: Redis 4版本新增特性,用于控制AOF重写期间是否使用RDB文件内容进行增量同步。默认情况下为no,如果设置为yes,则在AOF文件头加入一个RDB文件的内容,以尽可能减小AOF文件大小并方便数据恢复。

4. 混合持久化

在过去,Redis 用户通常会因为 RDB 持久化和 AOF 持久化之间不同的优缺点而陷入两难的选择当中:

  • RDB 持久化能够快速地储存和恢复数据,但是在服务器停机时可能会丢失大量数据。
  • AOF 持久化能够有效地提高数据的安全性,但是在储存和恢复数据方面却要耗费大量的时间。

为了让用户能够同时拥有上述两种持久化的优点, Redis 4.0 推出了一个“鱼和熊掌兼得”的持久化方案 —— RDB-AOF 混合持久化。

这种持久化能够通过 AOF 重写操作创建出一个同时包含 RDB 数据和 AOF 数据的 AOF 文件, 其中 RDB 数据位于 AOF 文件的开头, 它们储存了服务器开始执行重写操作时的数据库状态。至于那些在重写操作执行之后执行的 Redis 命令, 则会继续以 AOF 格式追加到 AOF 文件的末尾, 也即是 RDB 数据之后。

也就是说当开启混合持久化之后,AOF文件中的内容:前半部分是二进制的RDB内容,后面跟着AOF增加的数据,AOF位于两次RDB之间。
在这里插入图片描述
在目前版本中, RDB-AOF 混合持久化功能默认是处于关闭状态的, 要启用该功能, 用户不仅需要开启 AOF 持久化功能, 还需要将 aof-use-rdb-preamble 选项的值设置为 true。

appendonly yes
aof-use-rdb-preamble yes

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

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

相关文章

你知道什么是 BitMap 吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

哪个超声波清洗机品牌值得入手?销量榜品牌值得选购!

在科技日益发展的今天&#xff0c;超声波清洗技术以其高效、便捷和深度清洁的特点&#xff0c;已经深入到生活的诸多领域&#xff0c;从精密仪器到珠宝首饰&#xff0c;从眼镜框到假牙&#xff0c;甚至是厨房用品的日常护理&#xff0c;都能见到超声波清洗机的身影。面对市场上…

第105讲:Mycat垂直分表实战:从规划到解决问题的完整指南

文章目录 1.垂直分表的背景2.垂直分表案例实战2.1.垂直分表规划2.2.配置Mycat实现垂直分表2.3.重启Mycat2.4.在Mycat命令行中导入数据结构2.5.查看由Mycat分表后每个分片上存储的表2.6.Mycat垂直分表后可能遇到的问题2.7.垂直分表完成 1.垂直分表的背景 我们的商城系统数据库&…

基于JavaWEB SpringBoot婚纱影楼摄影预约网站设计和实现

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

两天学会微服务网关Gateway-Gateway工作原理

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

Vulnhub靶机:Bellatrix

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.4&#xff09; 靶机&#xff1a;Bellatrix&#xff08;10.0.2.9&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/hogwa…

【LangChain学习之旅】—(11) 记忆:通过Memory记住用户上次的对话细节

【LangChain学习之旅】—&#xff08;11&#xff09; 记忆&#xff1a;通过Memory记住客户上次买花时的对话细节 使用 ConversationChain使用 ConversationBufferMemory使用 ConversationBufferWindowMemory使用 ConversationSummaryMemory使用 ConversationSummaryBufferMemor…

VsCode搭建Spring Boot项目环境

VsCode搭建Spring Boot项目环境 1、前提条件&#xff1a;配置Java环境 下载安装JDK配置环境变量 2、VsCode配置SpringBoot环境 安装扩展 配置Maven 找到Maven配置文件&#xff0c;进行打开settings.json&#xff0c;添加如下代码&#xff1a; "workbench.iconThem…

码界深潜:全面解读软件工程的艺术与科学

&#x1f3e1; 基石构筑篇——软件工程基础理论及技能 &#x1f522; 编程语言选型与精修 于软件工程之浩瀚宇宙中&#xff0c;编程语言犹如各色画笔&#xff0c;每种语言的特性对应不同的创作领域。譬如Java倚仗跨平台兼容性和强大的面向对象机制&#xff0c;在企业级应用程序…

《GitHub新手入门指南:从零开始掌握基本用法》

在现代软件开发和技术社区中,GitHub已经成为了一个不可或缺的平台。它不仅是一个代码托管平台,更是一个技术交流、学习分享的社交平台。但对于初学者来说,GitHub可能会有些令人望而却步。本文将详细介绍GitHub的基本用法,帮助新手快速入门并融入这个充满活力的技术社区。 …

while 循环

语法格式&#xff1a; while (表达式) { 若干语句 } 执行规则 STEP1&#xff1a;计算表达式的值&#xff0c;如果 该值是true时&#xff0c;就进行STEP2&#xff0c; 否则执行STEP3。 STEP2&#xff1a;执行循环体&#xff0c;再进行 STEP1。 STEP3&#xff1a;结束while语句的…

WhatsApp API号注册平台价格对比:帮你选择性价比最高的服务

WhatsApp作为全球使用人数众多的即时通讯工具&#xff0c;推出的API服务为企业提供了强大的客户互动能力。然而面对众多提供WhatsApp API号注册的平台&#xff0c;企业在选择时很容易感到困惑。这篇文章将会对目前市面上比较主流的WhatsApp API号注册平台进行价格对比&#xff…

知识产权实缴注册资本的税务问题

2023年12月29日颁布的新《公司法》很快就要实施了。新《公司法》规定&#xff1a;公司注册资本需自公司成立之日起5年内缴足。因此&#xff0c;很多企业抓住政策的红利&#xff0c;通过知识产权实缴的方式实缴注册资本&#xff0c;这样可以不出现金就完成股东实缴注册资本的义务…

1.4 控制流程语句

1.4 控制流程语句 在C语言中&#xff0c;控制流程语句用于决定程序执行的流程。主要的控制流程语句包括条件语句和循环语句。 1.4.1 条件语句 条件语句允许根据条件的真假来执行不同的代码块。 1.4.1.1 if语句 if语句用于执行一个代码块&#xff0c;当给定的条件为真时执行…

Git 版本控制

Git 版本控制 1. About Version Control (关于版本控制)1.1. Local Version Control Systems (本地版本控制系统)1.2. Centralized Version Control Systems (集中化的版本控制系统)1.3. Distributed Version Control Systems (分布式版本控制系统) 2. 换行符的处理3. keyboard…

将一个时间序列中的每个元素转换为指定的日期格式

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将一个时间序列中的每个元素 转换为指定的日期格式 Series.dt.strftime() 选择题 以下关于代码输出结果的说法中正确的是? import pandas as pd ts pd.Series(pd.date_range("2024-03…

如何在 Java 中以编程的方式将 CSV 转为 Excel XLSX 文件

前言 Microsoft Excel的XLSX格式以及基于文本的CSV&#xff08;逗号分隔值&#xff09;格式&#xff0c;是数据交换中常见的文件格式。应用程序通过实现对这些格式的读写支持&#xff0c;可以显著提升性能。在本文中&#xff0c;小编将为大家介绍如何借助葡萄城公司地Java API…

数据结构c版(2)——二叉树

本章我们来了解一下二叉树这一概念。 目录 1.树概念及结构 1.1树的概念​​​​​​​ 1.2 树的特点&#xff1a; 1.3 树的相关概念 1.4 树的表示​​​​​​​ 1.5 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 …

H3C接入交换机收到大量上行口(连接汇聚交换机)TC报文该怎么处理?(排查思路及解决办法)

一、问题描述 H3C接入交换机收到大量上行口的TC报文。 二、告警信息 三、TC报文排查思路 1、检查物理链路是否有问题。 2、检查是否有可能存在环路。 3、终端接入的端口开启STP边缘端口。 4、根桥的下联端口开启STP根保护。 5、如果对端设备不是管辖的范围且无法管理到,可考虑…

「优选算法刷题」:在每个树行中找最大值

一、题目 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < N…