Redis——持久化策略

Redis持久化

Redis的读写操作都是在内存上,所以Redis性能高。 但是当重启的时候,或者因为特殊情况导致Redis崩了,就可能导致数据的丢失。 所以Redis采取了持久化的机制,重启的时候利用之间持久化的文件实现数据的恢复。

Redis提供了三种持久化的机制:

  • RDB:将某一段时间的内存数据,以二进制的方式写到磁盘中
  • AOF:每次执行写操作,都将命令以追加的方式写到文件中
  • 混合持久化方式:结合了RDB和AOF的优势

RDB机制

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 ps: 执行快照是一种比较重的操作,如果频率太低,那么当服务器崩了,那么丢失的数据就多,如果频率高,那么就会对性能造成影响。

手动触发

手动触发分别对应save和bgsave命令:

  • save命令:阻塞当前Redis服务器,直到RDB过程完毕为止,对于内存比较大的实例会造成长时间的阻塞。(这很不推荐)
  • bgsave:Redis过程执行fork之后,会创建子进程,RDB的持久化工作就是让子进程负载,完成后自动结束。

自动触发机制

  • 使用save配置。 如“save m n” 表示m秒内数据发送了n次修改,自动RDB持久化
  • 从节点进行全量复制操作的时候,主节点自动进行RDB持久化,随后将文件内容发送给从节点
  • 执行shutdown命令关闭Redis时,执行RDB持久化

下图是bgsave命令的过程:
在这里插入图片描述

  1. 执行bgsave的时候,Redis父进程判断当前进程是否存在其他进程的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回
  2. 如果不存在,父进程创建子进程,fork过程中父进程阻塞,可以通过info stat命令查看latest_fork_user选项,可以获取最近一次fork操作的耗时(单位是毫秒)
  3. 父进程fork完毕后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令
  4. 子进程会创建RDB文件,根据父进程内存生成一个临时快照文件,完成后对原有的文件进行替换。
  5. 最后,子进程发送信号给父进程,父进程更新统计结果

Redis默认的配置文件中提供了bgsave的方式

save 900 1
save 300 10
save 60 10000
  • 900s之内,对数据进行一次修改
  • 300s之内,对数据进行10次修改
  • 60s之内,对数据进行1000修改

如果触发了上面的条件,那么就会触发RDB机制。

RDB文件的处理

保存:RDB⽂件保存在dir配置指定的⽬录(默认/var/lib/redis/)下,⽂件名通过dbfilename配置(默认dump.rdb)指定。可以通过执⾏config set dir {newDir} 和 config set dbfilename {newFilename}运⾏期间动态执⾏,当下次运⾏时RDB⽂件会保存到新⽬录。

RDB的优缺点

  • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间上的数据快照。 使用于备份,全量复制等场景。
  • Redis加载RDB文件恢复数据远远快于AOF文件,因为RDB文件是以二进制存储的。
  • RDB方式数据没办法做到实时持久化/秒级持久。 因为bgsave每次运行都要执行fork创建子进程,属于重量操作,频繁操作成本高。

AOF机制

AOF持久化:以独立日志的方式记录每次写操作,重启的时候执行AOF文件中的命令达到恢复数据的目的。

可以在配置文件中开启appendonly yes选项,默认是不开启。
下图是AOF的工作流程
在这里插入图片描述

  1. 将所有的写入操作追加到aof_buf缓冲区中
  2. AOF缓冲区根据对应的策略向硬盘做同步操作
  3. 随着AOF文件越来越大,需要定期的AOF文件进行重写,达到压缩的目的
  4. 当Redis启动的时候,可以加载AOF文件进行数据的恢复

AOF命令写入的内容是以文本协议格式。 例如set hello world 这条命令,在AOF缓冲区追加如下文本所示

*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

AOF是选择文本协议来进行存储的,Redis以这种方式存储有可能的原因如下:

  • 文本协议有较好的兼容性
  • 实现简单,可读性好

看了AOF的工作流程后,想一想为什么AOF需要aof_buf这个缓冲区呢? Redis使用单线程响应命令,如果每次写AOF文件都直接同步到硬盘上,性能从内存到IO读写,性能会下降。 所以先将数据写入到aof_buf中,会有效降低IO的次数,同时Redis提供了3种缓冲区的同步策略。
如下图所示:

文件同步:

Redis提供了3种AOF缓冲区同步文件策略。由参数appendfsync控制

在这里插入图片描述

系统调用write和fsync:

  • write操作会触发延迟写机制。Linux在内核中提供了页缓冲区来提供硬盘IO性能。write在写入系统缓冲区后立即返回。同步硬盘操作依赖于系统调度机制。
  • fsync是对单个文件进行操作,做强制硬盘同步,fsync将阻塞直到数据写入到硬盘上。

当Redis同步策略为always时,每次写都要同步AOF文件,性能很差。
配置为no的时候,同步策略不可控,虽然提高了性能,但数据丢失的可能性增大了
当配置为everysec的时候,是默认配置,兼顾了数据安全和性能。

所以不同的策略,如果发送数据丢失,数据丢失的程度是不一样的,如果是always,那么每次都会进行同步操作,数据不会丢失,但是如果设置为no,那么数据丢失就可能很多,而everysec,数据只会丢失1s内的数据。

AOF重写机制

随着命令不断地写入到AOF文件中,文件会越来越大,为了解决这个问题,Redis引入了重写机制来解决。

什么是重写机制

Redis会将旧的命令删除掉,只会保留数据的最新版本。 并且多条写操作会合并成一条。

而较小的AOF文件一方面降低了硬盘的空间,一方面可以提高启动Redis恢复数据的速度。

AOF重写过程也分为手动触发和自动触发

  • 手动触发:调用bgrewriteof命令
  • 自动触发:根据auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定自动触发时机。

auto-aof-rewrite-min-size: 表示触发时AOF的最小文件大小,默认是64MB
auto-aof-rewrite-percentage:代表当前AOF占用大小相比较上次重写时增加的比例

AOF重写的流程图如下:
在这里插入图片描述

  1. 执行AOF重写请求
    如果当前进程正在执行AOF重写,请求不执行。如果当前进程正在执行bgsave操作,重写命令延迟到bgsave操作完毕后执行
  2. 父进程执行fork,创建子进程
  3. 重写
    a.主进程fork之后,继续响应其他命令。所有的修改写入到AOF的缓冲区中并根据appendfsync策略同步到硬盘,保证旧的AOF文件机制正确
    b. 子进程只有fork之前的所有内存信息。父进程需要将fork之后的这段时间的写操作写入到AOF重写缓冲区中
  4. 子进程根据内存快照,将命令合并到新的AOF文件
  5. 完成子进程重写,新文件写入后,子进程发送信号给父进程。父进程将AOF重写缓冲区的数据追加到新的AOF文件中。 最后将新的AOF文件替换旧的AOF文件

所以Redis持久化的机制为下图所示
在这里插入图片描述

为什么会有混合持久化

RDB的优势就是恢复速度快,因为是以二进制存储的,但是快拍的频率不好把握。频率太低,丢失的数据量就多,频率太多,就会导致性能降低

AOF的优点:丢失的数据少,但是恢复的速度不快。

所以结合了RDB和AOF的优点,Redis4.0推出了混合持久化的机制,保证了Redis的重启速度,又降低了数据丢失的风险。 混合持久化最大的差别就是AOF文件不再是以文本来存储的了,而是以二进制的方式来存储。这就导致了恢复数据的时候,速度会比AOF快。

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

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

相关文章

[Matplotlib教程] 02 折线图、柱状图、散点图教程

基于MFCC和CNN的语音情感识别 2 折线图、柱状图、散点图2.1 折线图2.1.1 简单折线图2.1.1 线形和Markevery2.1.2 带误差棒的折线图2.1.3 区间填充和透明度 2.2 柱状图2.2.1 分组柱状图2.2.2 堆叠柱状图2.2.3 横向柱状图 2.3 散点图 我们的网站是 菜码编程,我们的q群…

django项目添加测试数据的三种方式

文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式: 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…

2024华为杯数学建模研赛F题建模代码思路文章研究生数学建模

截止2024.8.21 12点 已更新F全部小问的建模和问题一的代码 #### https://docs.qq.com/doc/DVVBUREF2SmFhRUl3F题: 问题1:卫星轨道根数与运动学关系的数学模型 从卫星的轨道根数计算出它在特定时刻的三维位置和速度。轨道根数包括: 1.计算卫星的轨道半径…

Android Studio开发发布教程

本文讲解Android Studio如何发布APP。 在Android Studiobuild菜单栏下点击Generate Singed Bundle/APK…打开对话框。 选择APK点击Next 点击Create New...进行创建

【赵渝强老师】K8s的DaemonSets控制器

DaemonSet控制器相当于在节点上启动了一个守护进程。通过使用DaemonSet可以确保一个Pod的副本运行在 Node节点上。如果有新的Node节点加入集群,DaemonSet也会自动给新加入的节点增加一个Pod的副本;反之,当有Node节点从集群中移除时&#xff0…

KMP整理+个人推导+快速上手理解

整理了一下KMP的写法: 这个是我自己写的(个人推导,可能在时间复杂度上表现较弱,但是非常帮助初学者进行理解!) 下面是代码, ne 是next数组。我这个next数组表示的是: ne[i] : 当s…

Spring Boot框架在高校心理辅导中的实践

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,任…

独立站内容营销SOP 1.0 丨出海笔记

提到内容营销,可能很多朋友都听过但没深入做,国内跨境独立站通过内容营销做的大流量的目前不多,哪怕大如 Shein, Anker,大部分时候还是在买量获客的阶段。 但大家只要明白一点即可:内容做得好不好,直接影响…

AD中的PCB的原点怎么设置?

在AD中,可以通过编辑元件的属性或者直接在PCB编辑器中设置原点来设置PCB或元件的原点。 对于PCB设计,你可以在PCB编辑器中直接设置原点。首先,你需要打开你的PCB设计文件。然后,在PCB编辑器中,选择“编辑”菜单下的“原…

在JSP环境配置中遇到的一些问题

本人使用eclipse进行开发,在eclipse中配置环境。 1.安装Tomcat 下载版本为tomcat-9.0.95; 详见教程:tomcat下载安装及配置教程_tomcat安装-CSDN博客 遇到的问题:运行startup.bat会闪退, 解决办法:tomcat…

UI自动化测试(python)Web端4.0

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

众数信科 | CrowdAgents 企业级AI智能体平台

AI大模型在企业落地 还存在很多问题 企业需要什么样的大模型产品 众数信科 CrowdAgents企业级AI智能体平台 平台亮点 01 02 03 核心功能 AI智能体 AI企业智脑 Agent引擎 关于我们 众数信科成立于2021年,由云从科技联合厦门火炬集团、民生电商作为创始股东发起成…

智能仓库|基于springBoot的智能无人仓库管理设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书(可指定任意题目) 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 互联网发展至今,无论是其理论还是技术都已经成熟&#xf…

【24华为杯数模研赛赛题思路已出】国赛B题思路丨附参考代码丨免费分享

2024年华为杯研赛B题解题思路 B题 WLAN组网中网络吞吐量建模 问题1 请根据附件WLAN网络实测训练集中所提供的网络拓扑、业务流量、门限、节点间RSSI的测试基本信息,分析其中各参数对AP发送机会的影响,并给出影响性强弱的顺序。通过训练的模型&#xff…

数值计算 --- 平方根倒数快速算法(0x5f3759df,这是什么鬼!!!)

平方根倒数快速算法 --- 向Greg Walsh致敬! 1,牛顿拉夫逊 已知x,要计算,假设的值为a,则: ,(式1) 如果定义一个自变量为a的函数f(a): 则,令函数f(a)等于0的a就…

高算力芯片的发展

最近参与了2024年北京AI芯片峰会,虽然是讲AI芯片,但因为目前算力主要讲的是智能算力,所以,针对高算力芯片的发展趋势有重点的讲解。之前没有很系统关注这块,这次算是做了全面了解。下面,借用峰会的一些内容…

XXl-SSO分布式单点登录框架

概述 下载地址:https://gitee.com/xuxueli0323/xxl-sso 文档地址:https://www.xuxueli.com/xxl-sso/ 概述 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持…

基于SpringBoot+Vue的时尚美妆电商网站系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

Adobe出现This unlicensed Photoshop app has been disabled

Adobe Acrobat或Photoshop软件突然出现This unlicensed Photoshop app has been disabled 症状 解决方法 删除软件安装目录下的AcroCEF和acrocef_1l两个子文件夹。主要是为了删除AcroCEF.exe。 如果存在复发,则删除xxxxxxx\AdobeGCClient\AdobeGCClient.exe。 不…

Win10 安装VS Code

一、软件介绍 Visual Studio Code(简称VS Code)是一个由微软开发的免费、开源的代码编辑器。它支持Windows、Linux和macOS操作系统,并且提供了许多功能,使其成为许多开发者的首选开发工具。以下是VS Code的一些主要特点&#xff…