【Redis-04】Redis两种持久化方式

news2024/12/30 1:17:59

 Redis是基于内存的数据结构服务器,保存了大量的键值对数据,所以持久化到磁盘是非常必要的,Redis提供了两种持久化的方式,分别是RDB和AOF。下面我们看下这两种持久化方式的具体实现原理。

1.RDB持久化

 首先,RDB持久化方式会产生一个经过压缩的二进制文件,Redis服务器在启动之初,通过这个文件可以还原数据库的状态。那么我们接下来看下RDB文件是如何实现保存和载入的。

1.1 RDB文件的保存

 RDB文件的保存有两个命令可以实现,分别是savebgsave,执行后都会生成新的RDB文件,区别是save会阻塞服务器的进程,直到RDB文件创建完成为止,期间服务器不能处理任何客户端的命令请求。而bgsave通过派生出一个子进程,由子进程来完成RDB文件的创建,期间服务器正常处理客户端的命令请求。其实这两个命令的底层实现方式都一样,只不过一个是主进程来做,另一个是通过子进程来完成。
 在redis.conf文件中,有两个参数是和rdb的文件保存相关:

// 这个是rdb文件的名称
dbfilename dump.rdb

// 这个是rdb文件的保存路径,这是相对路径,相对于redis-server的启动路径
dir ./

1.2 RDB文件的载入

 在redis服务器启动之初,会去查找有没有rdb的持久化文件存在,如果有就会自动载入,当然前提是没有开启aof持久化的功能。在rdb载入期间会,服务器处于阻塞装填,直到载入工作完全结束。

1.3 RDB持久化时服务器的状态

  1. save命令执行期间,所有客户端命令都会被拒绝执行。
  2. bgsave命令执行期间,客户端发送的savebgsave命令会被拒绝执行,但是客户端发送的bgrewriteaof不会拒绝但会被阻塞,直到当前的bgsave命令执行完毕。但是值得说明的是,如果服务器在执行bgrewriteaof命令期间,客户端发送的bgsave命令会被服务器拒绝。当然这是站在性能角度考虑,否则fock出两个子进程,大量的进行磁盘的读写,会影响整个服务器的性能。

1.4 RDB持久化策略

 用户可以通过配置文件给RDB的持久化设置保存策略,看一下redis.conf文件中的配置:

save 900 1
save 300 10
save 60 10000

 以上的默认配置可以表示为:服务器在900秒之内,至少进行了1次的修改,在300秒之内至少进行了10次修改,在60秒之内至少进行了10000次修改。这三种策略只要满足一个,即可触发RDB的持久化。
 这里需要了解一下,Redis是怎么基于这些配置策略实现自动化间歇性保存RDB文件的,还是回到RedisServer这个这个结构体的源码中看一下:

struct redisServer {
    // 数组,用于保存redis.conf配置的持久化策略
    struct saveparam *saveparams;   /* Save points array for RDB */
    // 上面这个数组的长度
    int saveparamslen;              /* Number of saving points */
    // 记录上一次持久化到现在服务器修改了多少键值对
    long long dirty;                /* Changes to DB from the last save */
    // 记录上一次RDB持久化的UNIX时间戳
    time_t lastsave;                /* Unix time of last successful save */
}

 在redisServer中,有saveparams数组专门保存我们配置的持久化策略,这里使用到了saveparam这个结构体,看一下源码:

struct saveparam {
	// 这里是配置文件save的第二个参数
    time_t seconds;
    // 这里是配置文件save的第一个参数
    int changes;
};

 这样,配置文件中的持久化策略就记录到了redisServer.saveparam属性中,还是会基于serverCron这个时间事件函数,100ms执行一次,每次会检查 dirtylastsave 记录的修改键值对数量和时间差,是否匹配到了saveparam中配置的持久化策略,如果命中就进行新一轮的RDB持久化。

2.AOF持久化

 和RDB不同,AOF是通过记录Redis服务器中执行的写命令来记录数据库状态的,类似于mysql的binlog,当然保存的内容是经过协议转换的命令。在服务器启动之初,通过载入和执行AOF文件中的命令来还原数据库的状态。

2.1 持久化的实现

 在服务器执行命令之后,并不是立刻写入aof文件中,而是先写入 aof_buf缓冲区里面,这也是redisServer的一个属性结构:

struct redisServer {
    // aop缓冲区,记录服务器写入的命令
    sds aof_buf;      /* AOF buffer, written before entering the event loop */
}

 我们再看一下redis.conf关于aof持久化的一个配置:

// 这个表示每次执行都会写入
# appendfsync always
// 这个表示每秒写入一次
appendfsync everysec
// 这个由操作系统决定,无法控制
# appendfsync no

 AOF实现持久化的原理是这样的,客户端执行的命令会先记录到 redisServer.aof_buf 中,然后基于配置文件的appendfsync策略决定什么时候同步到AOF文件中。这里的同步也会经过两个步骤:

  1. aof_buf 内容写入到操作系统文件缓存 pagecache
  2. pagecache 落盘写入到屋里磁盘设备中;

 我们知道Redis是基于Reactor网络模型,不断进行事件循环,每进行一轮的事件循环,都会执行步骤1,所以从aof_buf 到 pagecache总是会发生。但是步骤2就跟appendfsync有关系了:

  • always表示只要步骤1发生,步骤2也会发生,所以是最安全,但是效率最慢的一个。
  • everysec表示步骤1发生后,步骤2每秒执行一次落盘,是效率和数据安全折中的方案,停机故障时有丢失1秒钟数据的风险。
  • no表示步骤1发生后,何时落盘由操作系统决定,数据丢失风险大,效率也一般,因为数据量过大,单次落盘的时间也最长。

 默认配置是everysec,即每秒执行一次数据落盘保存。

2.2 文件的载入与数据还原

 因为AOF文件中包含了重建数据库状态的所有写命令,所以服务器只要读入并全部执行一遍就可以完成数据库状态的还原。服务器在启动之初,会创建一个不带网络连接的伪客户端来做这件事,在载入命令完成后,这个客户端的使命就结束了。

2.3 AOF文件的重写

 随着写入到AOF文件的命令越来越多,这个文件体积会越来大,会对宿主机或文件还原造成一定的影响,所以需要通过AOF文件的重写来解决文件体积膨胀的问题。
 AOF文件重写并不是对现有AOF文件进行处理,而是基于数据库当前的状态来实现的。服务器会从数据库中读取键对应的值,然后用一条命令去记录键值对,代替之前可能存在的多条命令,写入到一个新的AOF文件中,这就是AOF重写功能实现的原理。需要注意的是,对于某些元素比较多的集合或者列表(默认配置是64个),这个一条命令可能拆分成多条实现,避免造成客户端输入缓冲区溢出的情况。
 和bgsave一样,AOF重写的动作也是放到子进程去执行,这样可以保证父进程可以继续处理名请求。但是这里会有一个问题,就是AOF文件重写期间,父进程处理命令请求之后,会和重写AOF文件时的数据库状态不一致。Redis解决这个问题的方法是设置一个AOF重写缓冲区,子进程一单创建并且开始重写命令之后,父进程处理的所有写命令请求都会记录到AOF重写缓冲区。当子进程重写工作完成之后,会生成一个新的AOF文件,向父进程发送一个信号,父进程在接受此信号,开始执行以下工作:

  1. AOF重写缓冲区的内容写入到新的AOF文件中,保证新文件和服务器当前的状态一致;
  2. 对新的AOF文件改名,并原子的替换现有的AOF文件,完成新旧文件的替换。

 以上两步,父进程会造成服务器进程的阻塞,但其他时间,都不会阻塞,整个重写动作对服务器性能的影响降到了最低,以上就是bgrewriteaof命令的实现原理。

在这里插入图片描述

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

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

相关文章

【Spring(二)】java对象属性的配置(Bean的配置)

有关Spring的所有文章都收录于我的专栏:👉Spring👈 目录 一、前言 二、通过Setter方法配置Bean 三、通过构造器配置Bean   1. 通过属性名配置   2. 通过索引配置   3. 通过属性类型配置 四、通过p命名空间配置bean 五、引用/注入其他bean…

openEuler快速入门-openEuler系统安装openGauss数据库安装

文章目录前言一、安装openEuler系统安装二、运行虚拟机,配置三、安装openGauss数据库总结前言 openEuler:openEuler 是一款开源操作系统。当前 openEuler 内核源于 Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能&a…

[附源码]java毕业设计网络身份认证技术及方法

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

_001_Zotero入门

Zetoro大纲一、安装Zotero二、收集题录2.1 浏览器插件2.2 通过标识符添加2.3 拖拽文献2.4 从剪切板导入2.5 批量导入2.6 手动添加(不建议使用)2.7 方法总结三、管理题录3.1 移动分类3.2 查重3.3 关联3.4 标签3.5 笔记3.6 RSS订阅3.7 快捷键3.8 总结四、在…

Verilog 时序逻辑 UDP

时序逻辑 UDP 与组合逻辑 UDP 在定义形式和行为功能上均有不同&#xff0c;主要区别如下&#xff1a; 1、时序逻辑 UDP 的输出端必须声明为 reg 型。2、时序逻辑 UDP 可以用 initial 语句初始化。3、状态表格式也稍有不同&#xff1a; ... : <current_state> : &l…

RabbitMQ初步到精通-第七章-RabbitMQ之延迟队列

目录 第七章-RabbitMQ之延迟队列 1. 延迟队列概念 2. 应用场景 3. 架构模式 3.1 队列TTL实现 3.2 消息TTL实现 3.3 插件实现 4. 代码验证 5. 总结 第七章-RabbitMQ之延迟队列 1. 延迟队列概念 延迟-意即 非实时&#xff0c;之前我们讨论大部分的案例都是生产者将消息发…

【毕业设计】61-基于单片机的超声波测距仪设计(原理图、仿真工程、低重复率参考设计文档、PPT、开题报告、任务书)

【毕业设计】61-基于单片机的超声波测距仪设计&#xff08;原理图、仿真工程、低重复率参考设计文档、PPT、开题报告、任务书&#xff09;[toc] 资料下载链接 资料下载链接 资料链接&#xff1a;https://www.cirmall.com/circuit/33762/ 包含此题目毕业设计全套资料&#xff…

UDS应用场景

诊断协议那些事儿 本文为诊断协议那些事儿专栏文章&#xff0c;旨在介绍诊断的应用场景&#xff0c;其本质就是一个用于汽车行业通信的需求规范&#xff0c;用于诊断功能数据的解析&#xff01;让读者对诊断有一个深入的认识。 关联文章&#xff1a;UDS协议发展历史 文章目录…

idea如何设置代理实现管理突破呢

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

抗锯齿渲染

&#xff08;逻辑绘图&#xff09;图像在坐标图中的显示&#xff1a; 笔的默认宽度为1&#xff0c;当笔的宽度大于1时&#xff0c;相当于在则条线的两边均匀加厚&#xff0c;确定坐标的还是这条宽度为1的线段&#xff0c;相当于宽度的中心位置。 物理绘图 &#xff08;默认情况…

集成学习、装袋法、提升法、GBDT、随机森林(机器学习)

集成学习 集成学习(Ensemble learning)是机器学习中近年来的一大热门领域。其中的 集成方法是用多种学习方法的组合来获取比原方法更优的结果 使用于组合的算法是弱学习算法 即分类正确率仅比随机猜测略高的学习算法 但是组合之后的效果仍可能高于强学习算法 即集成之后的…

总抱怨Mac运行速度又卡又慢?这些方法你用得上

通常大家处理Mac运行速度慢的方法不是重启就是清空废纸篓&#xff0c;但是这两种方法对于Mac提速性能的效果是微之甚微的&#xff0c;想要彻底解决Mac运行速度慢&#xff0c;你应该试试一下三种方法~ 1、清理磁盘空间 硬盘空间过少是Mac运行变慢很大的一个因素&#xff0c;各种…

第03章_基本的SELECT语句

第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有…

【用户画像】Redis的常用五大数据类型和配置文件介绍

文章目录一 常用五大数据类型简介1 Redis键(key)2 Redis字符串(String)3 Redis列表(List)4 Redis集合(Set)5 Redis哈希(Hash)6 Redis有序集合Zset(sorted set)二 Redis配置文件介绍1 UNITS2 INCLUDES3 NETWORK4 MEMORY MANAGEMENT一 常用五大数据类型简介 常用命令 1 Redis键…

攻防世界碎纸机11

碎纸机11 题目描述&#xff1a;我们从碎纸机里抢救回来了某个关键图片资料&#xff0c;你能帮我们修复它吗&#xff1f; 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87094757 打开文件&#xff0c;发现是让我们拼图。 可以用python脚本进行拼接。 脚…

pytorch初学笔记(七):神经网络基本骨架 torch.nn.Module

目录 一、 torch.nn模块 二、module模块 三、自定义搭建神经网络 一、 torch.nn模块 torch.nn — PyTorch 1.13 documentation 二、module模块 Module — PyTorch 1.13 documentation 我们自己定义的神经网络需要继承nn.Module类&#xff0c;需要重写以下两个方法&#xf…

智慧林业解决方案-最新全套文件

智慧林业解决方案-最新全套文件一、建设背景二、建设架构1、火险预警2、AI林火分析3、应急指挥4、森林资源GIS5、林业巡检6、林业OA三、建设方案四、获取 - 智慧林业全套最新解决方案合集一、建设背景 森林资源是林地及其所生长的森林有机体的总称&#xff0c;以林木资源为主&…

设计模式之设计原则

程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据。设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为…

Python基础语法入门

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 上一节课&#xff0c;我们了解了基础环境如何配置&#xff0c…

【深度学习】图像分类数据集Fashion-MNIST

今天在手撸深度学习代码的时候&#xff0c;遇到了这个数据集&#xff0c;但是调用的函数的参数和功能不是很明白&#xff0c;因此选择写篇博客总结一下。 一、介绍 Fashion-MNIST是⼀个10类服饰分类数据集。 torchvision 包&#xff1a;它是服务于 PyTorch 深度学习框架的&a…