当前位置: 首页 > news >正文

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快。

相关文章:

Redis——持久化策略

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

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…...

SpringCloud的学习(三),Resilience4j

CircuitBreaker断路器 “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或…...

【计算机网络篇】计算机网络概述

本文主要介绍计算机网络第一章节的内容,文中的内容是我认为的重点内容,并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 🎯一.计算机网络的组成 ✨主要内容 1.边缘部…...

UDS诊断-面试题2

bilibili视频推荐: 车载测试面试题UDS诊断协议,你知道什么是UDS诊断?ECU是什么?刷写ECU_哔哩哔哩_bilibili 总结: 1.汽车诊断UDS含义: 一套统一的诊断服务命令。 2.具体操作流程: 使用电脑…...

ovirt error: Network not found: no network with matching name ‘vdsm-ovirtmgmt‘

Ovirt Node节点启动vm出现 error: Network not found: no network with matching name ‘vdsm-ovirtmgmt’ 错误的常见情况有以下几种:常见情况有以下几种: 网络配置丢失或未正确配置: ○ 在 oVirt 或 libvirt 环境中,如果网络配…...

2024百度的组织架构和产品分布

百度2024年的组织架构主要分为以下几个事业群组,每个事业群组负责不同的产品和服务: 一、智能云事业群组(ACG) 主要产品与服务: 百度云:提供云计算、存储、大数据处理等服务。AI云服务:包括语…...

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…...

缓存技巧 · Spring Cache Caffeine 高性能缓存库

Caffeine 背景 Caffeine是一个高性能的Java缓存库,它基于Guava Cache进行了增强,提供了更加出色的缓存体验。Caffeine的主要特点包括: 高性能:Caffeine使用了Java 8最新的StampedLock乐观锁技术,极大地提高了缓存的并…...

RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)

RabbitMQ 是一个消息代理系统,使用交换机(Exchange)、队列(Queue)和路由键(Routing Key)来管理消息的传递。它们分别起到不同的作用,构成了消息从生产者到消费者的传递路径。 以下是…...

解码 OpenAI 的 o1 系列大型语言模型

OpenAI 表示,其 Strawberry 项目已升级为新的大型语言模型 (LLM) 系列,公司将其命名为 OpenAI o1。 该公司表示,新系列模型还包括一个 o1-mini 版本,以提高成本效益,可根据其推理能力与最新的GPT-4o 模型进行区分。 …...

大小端字节序 和 内存高低地址顺序

目录 1. 大小端字节序 1.1 什么是大小端字节序? 1.2 为什么有大小端字节序? 1.3 习题:用程序结果判断大端小端 2. 各种易混淆的高低地址顺序 2.1 监视窗口的地址表示【计算机标准展示方式】 2.2 横向地址表示 2.3 一个字节 与 多个字节 的地址…...

Spring扩展点系列-MergedBeanDefinitionPostProcessor

文章目录 简介源码分析示例示例一:Spring中Autowire注解的依赖注入 简介 spring容器中Bean的生命周期内所有可扩展的点的调用顺序 扩展接口 实现接口ApplicationContextlnitializer initialize AbstractApplicationContext refreshe BeanDefinitionRegistryPos…...

Centos 7.9 使用 crontab 实现开机启动

[rootlocalhost ~]# crontab -e [rootlocalhost ~]# reboot # crontab -e reboot /path/to/my/program # reboot 表示重启开机的时候运行一次 reboot /test/hello.sh 参考: Linux crontab 命令 https://www.runoob.com/linux/linux-comm-crontab.html Run prog…...

基于微信的设备故障报修管理系统设计与实现+ssm论文源码调试讲解

2相关技术 2.1微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。尤其拥抱微信生态圈,让微信小程序更加的如虎添翼,发展迅猛。 2.2 MYSQL数据…...

yolo自动化项目实例解析(二)ui页面整理 1.78

我们在上一章整理main.py 的if __name__ __main__: 内容还留下面这一段, from PyQt5.QtWidgets import *from lanrenauto.moni.moni import *from PyQt5.QtGui import *app QApplication(sys.argv) # 初始化Qt应用ratio screen_width / 2560 # 分辨率比例# 设…...

PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目

项目地址: GitHub - github201014/PyQt-NativeWindow: A class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypesA class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypes - github201014/PyQt-NativeWindow…...

面试时遇见的项目问题

汽车在线销售平台项目 项目的甲方是谁? 甲方是一家汽车销售公司,他们希望通过互联网技术提升销售效率和服务质量 为什么要做这个项目? 很多消费者越来越倾向于在线上完成购车之前的大部分决策。所以甲方找到我们希望通过建立一个在线的销…...

在线骑行网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装在线骑行网站软件来发挥其高效地信息处理的作用&#xff0c…...

大批量查询方案简记(Mybatis流式查询)

Mybatis的流式查询 摘要: 介绍使用mybatis流式查询解决大数据量查询问题. 1 业务背景 开发中遇到一个业务,说起来也很无奈:公司用的数据库MySQL,一张表里只保留了一个月的数据,但是数据量竟然高达2000W还要多,然后用户有个需求也很恶心,为了完成这个业务我需要定时任务每一个月…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

Java编程之桥接模式

定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found"​, "n…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...