Redis 持久化详解:RDB 与 AOF 的配置、触发机制和实际测试

news2024/10/6 1:39:41

什么是持久化?

就是 Redis 将内存数据持久化到硬盘,避免从数据库恢复数据。之所以避免从数据库恢复数据是因为后端数据通常有性能瓶颈,大量数据从数据库恢复可能会给数据库造成巨大压力。

Redis 持久化通常有 RDB 和 AOF 两种方式,RDB 相当于快照备份,AOF 相当于追加形式的备份。

Redis 重启的时候,恢复数据的优先级 RDB > AOFAOF 恢复的优先级 appendonly.aof.{x}.base.rdb>appendonly.aof.{x}.incr.aof

一、RDB

1.1、什么是 RDB?

RDB 是 Redis DataBase 的缩写,RDB 就是将当前进程数据生成的快照保存到磁盘(相当于某一时刻的快照),因此磁盘中的值 <= 内存中的值。

1.2、RDB 怎么配置?怎么用?

触发 RDB 分为手动触发和自动触发两方式。

手动触发

手动触发有 save 和 bgsave 两个方式的命令

  • save 命令:阻塞当前 Redis 服务器,直到 RDB 操作完成为止。如果 Redis 中数据比较多,会造成长时间的阻塞,线上不建议使用此命令。此命令通常主动执行 save 命令或者手动停止重启 redis 服务的时候触发。
  • bgsave 命令:Redis 进程执行 fork 操作创建子进程,RDB 的持久化由子进程负责,完成后自动结束。阻塞只会发生在 fork 阶段,时间通常很短。此命令通常在 redis.conf 中配置 save m n 触发。

bgsave 流程如下

  1. Redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令。
  2. 主进程判断当前是否存在正在执行的子进程,如果存在,主进程直接返回。
  3. 如果不存在正在执行的子进程,fork 一个新的子进程进行持久化数据,fork 过程是阻塞的,fork 操作完以后,主进程去执行其他操作。
  4. 子进程先将数据写入到临时的 rdb 文件中,待快照数据写入完成以后,替换旧的 rdb 文件。
  5. 同时子进程发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息。
graph TD
    A[开始] -->|执行 bgsave 命令| B(判断是否存在执行的子进程)
    B -->|存在| C[主进程直接返回]
    B -->|不存在| D[fork 新的子进程]
    D -->|fork 完成| E[主进程继续其他操作]
    D -->|写入数据到临时 RDB| F[写入完成]
    F -->|替换旧的 RDB 文件| G[发送信号给主进程]
    G -->|主进程更新统计信息| H[结束]

img

自动触发

在下面 4 种情况下会自动触发

  1. redis.conf 中配置 save m n,即在 m 秒中有 n 次修改,自动触发 bgsave 生成 rdb 文件。
  2. 主从复制的,从节点从主节点全量复制的时候。
  3. 执行 debug reload 命令的时候。
  4. 执行 shutdown 命令的时候。

关闭 RDB 持久化 redis.config 文件中设置 save "" 就会关闭 redis 的 rdb 持久化(redis.config 文件更改以后,需要重启 redis,redis 的配置才会生效),除非手动执行 save/bgsave 命令,否则 redis 不会进行 rdb 操作。

1.3、实际测试
  1. 停止 redis,redis 自动执行 save 命令,保存数据。

img

img

  1. 通过几秒内几个键更改,自动 rdb。

img

img

img

二、AOF

2.1、什么是 AOF?

AOF 是 Redis 以追加形式备份 Redis 数据的一种方式。

AOF 持久化的工作机制:

  1. 当 Redis 执行了一个写命令(SET、LPUSH、SADD)时,它会将该命令以文本协议的形式追加导 AOF 文件的末尾。
  2. 为了保证 Redis 在发生故障的时候,数据也不会丢失,Redis 会不断地将这些命令写入硬盘。
  3. 当 Redis 重启的时候,它会读取 AOF 文件中所有的命令并重新执行它们,一次来回复数据。

AOF 的三种同步频率:

  1. always:每个 Redis 写命令都会立刻同步到 AOF 文件中,这种模式提供了非常高的数据安全性,但是由于每次写入都需要进行磁盘 IO,性能可能会受到影响。
  2. everysec(默认配置):每秒钟同步一次,这种模式下,如果发生故障,最多丢失一秒钟的数据。这通常是一种很好的这种方案,提供了良好的性能和合理的数据安全性。
  3. no:由操作系统决定何时进行同步,这种模式可能会导致数据的丢失,因为在发生故障时,系统可能还没有来的及将数据写入磁盘。

AOF 文件的重写(压缩):

随着时间的推移,AOF 文件可能会变得非常大,因为每次写操作都会追加到文件中。Redis 提供了 AOF 重写的功能,这个过程可以创建一个新的 AOF 文件,文件中只包含了恢复当前数据状态所需要的最小命令集。这样可以减少磁盘的占用空间,并提高 Redis 的恢复速度。

Redis 的 AOF 重写是一个后台操作,它不会阻塞主 Redis 进程。在重写的过程中,对数据库的新写入会同时记录在旧的 AOF 文件和一个重写缓冲区中。当新的 AOF 文件准备好后,Redis 会将重写缓冲区中的所有命令追加到新的 AOF 文件中,并进行原子的替换旧的 AOF 文件。

AOF 持久化对应的文件:

img

2.2、AOF 怎么配置?怎么用?

在 Redis 的配置文件(通常是 redis.conf)中,可以通过以下配置启用 AOF 持久化:

appendonly yes

重写 aof 文件的命令(压缩)

bgrewriteaof

然后根据需要设置 AOF 的同步频率

appendfsync everysec

还可以配置自动重写的触发条件

当 AOF 文件增长到原始大小的 100% (翻倍)时,且文件至少有 64MB 时,Redis 会自动触发重写过程。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
2.3、实际测试

开启 aof 持久化

img

设置 aof备份的频率

img

查看 aof 的日志文件

img

测试压缩后的 aof 文件

img

img

最后

我是 xiucai,一位后端开发工程师。

如果你对我感兴趣,请移步我的[个人博客](),进一步了解。

  • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊

  • 本文首发于个人博客,未经许可禁止转载💌

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

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

相关文章

​ PaddleHub 首页图像 - 文字识别chinese_ocr_db_crnn_server​

PaddleHub 便捷地获取PaddlePaddle生态下的预训练模型&#xff0c;完成模型的管理和一键预测。配合使用Fine-tune API&#xff0c;可以基于大规模预训练模型快速完成迁移学习&#xff0c;让预训练模型能更好地服务于用户特定场景的应用 零基础快速开始WindowsLinuxMac Paddle…

算法学习系列(三十):高斯消元解线性方程组

目录 引言一、高斯消元法二、代码模板三、例题 引言 这个高斯消元法主要是线性代数的一些东西&#xff0c;然后步骤跟上课讲的步骤是一样的&#xff0c;只不过使用代码实现了而已&#xff0c;在竞赛和笔试中还是有出现的可能的&#xff0c;所以掌握它还是很重要的&#xff0c;…

「 典型安全漏洞系列 」07.OS命令注入详解

引言&#xff1a;什么是操作系统命令注入&#xff0c;如何防御和利用漏洞&#xff1f; 1. 简介 操作系统命令注入&#xff08;OS command injection&#xff09;是一种Web安全漏洞&#xff0c;允许攻击者在运行应用程序的服务器上执行任意操作系统&#xff08;OS&#xff09;命…

专栏:数据库、中间件的监控一网打尽

前言 对于数据库、中间件的监控&#xff0c;目前社区里最为完善的就是 Prometheus 生态的各个 Exporter&#xff0c;不过这些 Exporter 比较分散&#xff0c;不好管理&#xff0c;如果有很多目标实例需要监控&#xff0c;就要部署很多个 Exporter&#xff0c;要是能有一个大一…

基于springboot的房屋交易系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 交换排序 快速排序 hoare版代…

【CanvasKeyFrames - HTML5 Canvas 图片序列帧播放工具】

前言 一、CanvasKeyFrames 是什么&#xff1f; 用来做canvas动画的工具。 二、使用步骤 效果如图&#xff1a;上下波动的线条 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; 在html中引入&#xff1a; <script src"canvas-keyframes.js"><…

基于springboot药房管理系统源码和论文

伴随着全球信息化发展&#xff0c;行行业业都与计算机技术相衔接&#xff0c;计算机技术普遍运用于药房管理行业。实施计算机系统来管理可以降低逍遥大药房管理成本&#xff0c;使整个逍遥大药房行业的发展有显著提升。 本论文主要面向逍遥大药房管理中出现的一些常见问题&…

多符号表达式的共同子表达式提取教程

生成的符号表达式&#xff0c;可能会存在过于冗长的问题&#xff0c;且多个符号表达式中&#xff0c;有可能存在相同的计算部分&#xff0c;如果不进行处理&#xff0c;计算过程中会导致某些算式计算多次&#xff0c;从而影响计算效率。 那么多个符号表达式生成函数时&#xf…

深信服技术认证“SCSA-S”划重点:基线管理与安全配置

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

Java 集合 03 综合练习(黑马)

练习1、 ps&#xff1a;输出结果为地址值&#xff0c;是因为在输出对象时&#xff0c;默认调用了对象的toString()方法。在没有重写toString()方法的情况下&#xff0c;toString()方法返回的是对象的地址值。如果想要输出对象的属性值而不是地址值&#xff0c;可以重写toString…

记一个有趣的bug:panic执行时机

其实这并不是一个Bug&#xff0c;只是在收拢一个后端模块的错误日志和错误码时发现在请求成功时始终会多一条错误日志 最开始大概长这样。msg在算子不报错误的情况下不被赋值&#xff0c;所以这里不会打印错误日志&#xff0c;后面收拢了该模块的错误码&#xff0c;导致msg在…

爬虫学习笔记-xpath的基本使用

html示例 基本使用 #导入包 #pip install lxmlfrom lxml import etree# xpath解析 # 1.本地文件 etree.parse # 2.服务器响应的数据 etree.HTML()tree etree.parse(baidu.html) # 获取所有的ul下的li标签 l1 tree.xpath(//ul/li) print(l1) print(len(l1))# 获取所有带有id的…

js数组/对象的深拷贝与浅拷贝

文章目录 一、js中的深拷贝和浅拷贝二、浅拷贝1、Object.assign()2、利用es6扩展运算符&#xff08;...&#xff09; 二、深拷贝1、JSON 序列化和反序列化2、js原生代码实现3、使用第三方库lodash等 四、总结 一、js中的深拷贝和浅拷贝 在JS中&#xff0c;深拷贝和浅拷贝是针对…

python零散学习

文章目录 __name__和__main__关系变量/函数的命名规则&#xff08;下划线&#xff09;python&#xff1a;List列表、Tuple元组、Dic字典%占位符使用class相关python常见内置类属性self python内置函数isinstance&#xff08;object,classtype&#xff09;globals() 高级语法相关…

干货分享 | TSMaster 信号映射的配置方法

TSMaster信号映射模块可以将数据库变量映射为系统变量&#xff0c;经过映射后的系统变量就等同于数据库中的变量&#xff0c;该系统变量的读写操作就等同于读写数据库变量。其在系统软件中的位置如下图所示&#xff1a; 信号映射模块设计的目的&#xff0c;就是为了实现上层应用…

新建VM虚拟机-安装centOS7-连接finalshell调试

原文 这里有问题 首先进入/etc/sysconfig/network-scripts/目录 cd /etc/sysconfig/network-scripts/ 然后编辑文件 ifcfg-ens33 vi ifcfg-ens33

树--二叉树(C语言纯手凹)

目录 1.什么是树&#xff1f;&#xff08;不深入&#xff0c;仅做了解&#xff09; 2.树的表示方式 2.1孩子兄弟表示法&#xff08;左孩子右兄弟&#xff09; 2.2孩子表示法 2.3双亲表示法 3.什么是二叉树 4.二叉树分类 4.1满二叉树 4.2完全二叉树 4.3二叉搜索树&#x…

键盘上Ins键的作用

前几天编写文档时&#xff0c;发现一个问题&#xff1a;插入内容时&#xff0c;输入的字符将会覆盖光标位置后的字符。原来是按到了键盘上的 Ins键&#xff0c;解决方法是&#xff1a;再按一次 Ins键&#xff08;Ins键如果独立作为一键时&#xff0c;否则使用 “Fn Ins”组合键…

如何搭建Nextcloud云存储网盘并实现无公网ip访问本地文件【内网穿透】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…