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

Redis---持久化

Redis是内存数据库,是把数据存储在内存中的,但是内存中的数据不是持久的,如果想要做到持久,那么就需要让redis将数据存储到硬盘上。

Redis持久化有两种策略:

  • RDB  ==> Redis DataBase   RDB机制采取的是定期备份
  • AOF ==>  Append Only File  AOF机制采取的是实时备份

接下来将好好说说这两种策略~

RDB

RDB会定期地将Redis中的数据生成一份快照,接着将这份快照保存到硬盘中。后续Redis重启了,就会读取这份快照,将数据恢复回来。

定期具体点,又分为两种方式:1.手动触发  2.自动触发

手动触发

用户通过redis客户端,执行特定的命令,手动地触发快照生成。

  • save:执行save的时候,redis会全力以赴地进行“快照生成”操作,此时会阻塞redis的其它客户端的命令,导致类似keys *的后果,基本不采取。
  • bgsave:Redis进程执行fork操作创建出子进程,RDB持久化过程交由子进程去操作,完成后自动结束。阻塞只发生在fork阶段、一般时间很短。

自动触发

1.在redis的配置文件中,设置save配置。如”save m n“表示m秒内,数据集发生了n次修改,自动RDB持久化。

2.也可以从节点进行全量复制操作时,主节点自动进行RDB持久化,随后将RDB文件内容发送给从结点。

3.还可以执行shutdown命令,关闭redis,执行RDB持久化。

bgsave流程说明

1.执行bgsave命令后,redis父进程首先会判断当前是否存在正在执行的子进程,如果有,则返回。

2.如果没有,则通过fork创建子进程,在创建子进程时会阻塞父进程。创建完成后,bgsave会返回“background saving started”信息,不再阻塞父进程,父进程接着下面的操作。

3.子进程创建出来后,会创建RDB文件,由于子进程继承了父进程的内存、文件描述符等等,因此可以根据父进程中的内存的数据生成快照,并且对原有的RDB文件进行替换,结束后发送信号通知父进程表示完成,接着子进程结束。

RDB文件

redis生成的RDB文件,是在redis的工作目录中的,可以在redis的配置文件中进行设置。生成的RDB文件为:dump.rdb

RDB为使用LZF算法,将数据进行压缩,并且以二进制的形式,保存在这个文件中。虽然压缩会消耗CPU资源,但是能节省不少空间。

在redis服务器启动的时候,如果dump.rdb文件被损坏,那么服务器会启动失败(使用RDB机制的情况下)。因此redis提供了RDB文件的检测工具:redis-check-dump。

dump.rdb文件始终只有一个:尽管进行多次的RDB持久化,RDB会把要快生成的快照数据先保存在一个临时文件中,等快照数据生成完毕,会删除原来的dump.rdb,生成新的dump.rdb。

RDB的优缺点

优点:

①RDB是一个压缩的二进制文件,代表着某个时间点中redis的内存中的数据,非常适用于备份,全量复制等场景。

②redis加载RDB数据比AOF数据快。

缺点:

①RDB没办法进行实时持久化,每次运行bgsave都需要创建子进程,执行成本高。

②RDB有多个版本,兼容性存在问题。

RDB最大的问题在于不能实时持久化,在两次生成快照期间,可能会由于某种因素导致redis服务器重启,从而导致数据丢失的问题。

AOF

AOF介绍

AOF提供的是实时的持久化,解决RDB不能持久化的问题。AOF类似于MySQL中的binlog,会将用户的每一个操作,记录在文件中。当redis服务器重启后,会读取AOF的文件来恢复数据。

在redis的配置文件中,将AOF机制启动:

启动后重启redis服务器,则开启aof,在工作目录(/var/lib/redis)中出现了appendonly.aof的文件,这个文件就是用于记录redis内存数据的文件。

AOF是一个文本文件:

AOF工作流程

AOF的工作流程操作:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)。

所有的写入(append) 会追加到aof_buf缓冲区中,接着AOF会根据策略向硬盘做出同步操作。

如果AOF文件过大,需要进行重写(rewrite),进行压缩,节省空间。

当redis服务器启动时,会加载AOF文件进行数据的恢复。

AOF过程中为什么需要aof_buf这个缓冲区?

换句话说,引入AOF后,redis又要写内存又要写硬盘,这样效率会降低吗?其实不会,因为AOF机制,会先将数据放入aof_buf缓冲区中,数据累积到一定的量后,统一写入硬盘,降低IO次数,并且采取的是顺序写入,效率高。

同时,redis还提供了不同的缓冲区策略,给用户根据实际情况做出合理的选择。

文件同步

可配置值说明
always

命令写入aof_buf后调用fsync同步,完成后返回。频率和数据可靠性最高,性能最低

everysec

命令写入aof_buf后只执行write操作,不进行fsync,每秒由同步线程进行fsync。

频率和数据可靠性一般,性能一般

no

命令写入aof_buf后只执行write操作,由os控制fsync。

频率和数据可靠性低,性能最高

系统调用write和fsync

write操作会在写入系统缓冲区后立即返回。

fsync只针对单个文件操作,强制硬盘同步,阻塞直到数据完全写入硬盘。

重写机制

随着AOF文件越来越大,它会影响到redis下次启动的时间,因为redis服务器在启动的时候,需要读取AOF文件,为了解决这个问题,AOF采取了重写机制。

AOF文件记录了用户的操作过程,但实际上,redis启动时读取AOF文件,只关心最终结果。比如用户A对同一个变量做了增加、修改、修改、修改操作,redis在读取时,只关心最后一次的修改,并不关心前面的操作如何。

因此,redis会对AOF文件进行整理,这个整理就是提出冗余的操作,合并一些操作。注意,这个过程,也是重新生成了一份AOF文件,AOF文件重写是把Redis进程内的数据转化为写命令同步到新的AOF文件。

AOF重写触发

AOF重写触发可以分为手动触发和自动触发。

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

auto-aof-rewrite-min-size:表示触发从写时AOF最小文件大小,默认64MB.

uto-aof-rewrite-percentage:代表当前AOF占用大小相较于上次重写时增加的比例。

AOF重写流程

父进程通过fork创建子进程,子进程由于继承了父进程的内存、文件描述符等,可以把父进程fork前内存中的数据获取出来,以AOF的格式写入到一个新的AOF文件中。(内存中的数据,相当于整理后的数据了)。

在子进程写新aof文件的同时,父进程仍然不停地接收新的数据,并将这些数据同时写到aof_buf缓冲区和aof_rewrite_buf缓冲区中。aof_buf缓冲区的数据会被刷新到旧AOF文件中,而aof_rewrite_buf是用于子进程将新aof文件写完后,通知父进程,父进程再把这个缓冲区中的数据写入到新AOF文件中,最后用新AOF文件替换旧AOF文件。

父进程在重写的过程中,还在对旧AOF文件进行写入的目的:

在极端情况下,在子进程重写时服务器突然挂了,重启后,子进程内存的数据会丢失,新AOF文件的内容不完整,可以使用旧AOF文件来保证数据的完整性。

如果在执行bgwriteaof时,此时redis正在进行重写,那么就不执行了。

如果在执行bgwriteaof时,此时的redis正在生成RDB文件的快照时,会等待RDB文件生成完毕,再进行重写。

混合持久化

AOF是按照文本方式进行写入的,后续加载成本较高,因此redis结合RDB和AOF两种方式的特定:

按照AOF的方式将每一个操作记录在文件中,触发AOF重写,就会将当前内存的状态按照RDB的二进制格式写入到新的AOF文件中,后续再进行操作时,依然会按照AOF的文本格式进行追加写入。简单的说就是在重写时采取RDB的二进制格式写入,在其它操作依然采用AOF的文本格式进行写入。

混合持久化在配置文件中需要打开:

Redis的选择

当AOF和RDB同时打开时,redis会优先选择AOF方式,因为AOF中包含的数据会比RDB的安全,完整。

总结

Redis提供了两种持久化方式,就是RDB和AOF。

RDB是对内存数据的快照,采取的是定期持久化,AOF是对修改命令的保存,采取的是实时持久化,并且由有重写机制来定期压缩AOF文件。

RDB和AOF都使用fork创建子进程,利⽤Linux子进程拥有父进程内存快照的特点进行持久化,尽可能不影响主进程继续处理后续命令。

相关文章:

Redis---持久化

Redis是内存数据库,是把数据存储在内存中的,但是内存中的数据不是持久的,如果想要做到持久,那么就需要让redis将数据存储到硬盘上。 Redis持久化有两种策略: RDB > Redis DataBase RDB机制采取的是定期备份AOF …...

从 Flask 切到 FastAPI 后,起飞了!

我这几天上手体验 FastAPI,感受到这个框架易用和方便。之前也使用过 Python 中的 Django 和 Flask 作为项目的框架。Django 说实话上手也方便,但是学习起来有点重量级框架的感觉,FastAPI 带给我的直观体验还是很轻便的,本文就会着…...

状态码转文字!!!(表格数字转文字)

1、应用场景:在我们的数据库表中经常会有status这个字段,这个字段经常表示此类商品的状态,例如:0->删除,1->上架,0->下架,等等。 2、我们返回给前端数据时,如果在页面显示0…...

Pytorch 复习总结 4

Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 深度学习计算。 本文先介绍了深度学习中自定义层和块的方法,然后介绍了一些…...

YOLOv9中加入SCConv模块!

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、本文介绍 本文将一步步演示如何在YOLOv9中添加 / 替换新模块,寻找模型上的创新! 适用检测目标: YOLOv9模块…...

代码随想录算法训练营第四十七天丨198. 打家劫舍、​ 213. 打家劫舍 II​、337. 打家劫舍 III

198. 打家劫舍 自己的思路: 初始化两个dp数组,dp[i][0]表示不偷第i户,在0-i户可以偷到的最大金额,dp[i][1]表示偷i户在0-i户可以偷到的最大金额。 class Solution:def rob(self, nums: List[int]) -> int:n len(nums)dp […...

龙蜥Anolis 8.4 anck 安装mysql5.7

el8没有用mysql5.7了,镜像里是mysql8。 禁用 sudo dnf remove mysql sudo dnf module reset mysql sudo dnf module disable mysql 修改Yum源 sudo vi /etc/yum.repos.d/mysql-community.repo [mysql57-community] nameMySQL 5.7 Community Server baseurlhttp:…...

【踩坑】修复xrdp无法关闭Authentication Required验证窗口

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 问题如下,时不时出现,有时还怎么都关不掉,很烦: 解决方法一:命令行输入 dbus-send --typemethod_call --destorg.gnome.Shell /org/gnome/Shell org.gn…...

python学习笔记 - 标准库常量

Python 中有一些内置的常量,它们是一些特殊的值,通常不会改变。以下是其中一些常见的内置常量及其详细解释以及使用示例: True: 表示布尔值真。给 True 赋值是非法的并会引发 SyntaxError。 x True print(x) # 输出&#xff1a…...

视频和音频使用ffmpeg进行合并和分离(MP4)

1.下载ffmpeg 官网地址:https://ffmpeg.org/download.html 2.配置环境变量 此电脑右键点击 属性 - 高级系统配置 -高级 -环境变量 - 系统变量 path 新增 文件的bin路径 3.验证配置成功 ffmpeg -version 返回版本信息说明配置成功4.执行合并 ffmpeg -i 武家坡20…...

02| JVM堆中垃圾回收的大致过程

如果一直在创建对象,堆中年轻代中Eden区会逐渐放满,如果Eden放满,会触发minor GC回收,创建对象的时GC Roots,如果存在于里面的对象,则被视为非垃圾对象,不会被此次gc回收,就会被移入…...

R语言数据可视化之美专业图表绘制指南(增强版):第1章 R语言编程与绘图基础

第1章 R语言编程与绘图基础 目录 第1章 R语言编程与绘图基础前言1.1 学术图表的基本概念1.1.1 学术图表的基本作用1.1.2基本类别1.1.3 学术图表的绘制原则 1.2 你为什么要选择R1.3 安装 前言 这是我第一次在博客里展示学习中国作者的教材的笔记。我选择这本书的依据是作者同时…...

网站添加pwa操作和配置manifest.json后,没有效果排查问题

pwa技术官网:https://web.dev/learn/pwa 应用清单manifest.json文件字段说明:https://web.dev/articles/add-manifest?hlzh-cn Web App Manifest:Web App Manifest | MDN 当网站添加了manifest.json文件后,也引入到html中了&a…...

MongoDB聚合运算符:$cosh

文章目录 语法使用举例双曲余弦值角度双曲余弦值弧度 $cosh聚合运算符用来计算双曲余弦值&#xff0c;返回指定表达式的双曲余弦值。 语法 { $cosh: <expression> }<expression>为可被解析为数值的表达式$cosh返回弧度&#xff0c;使用$radiansToDegrees运算符可…...

Jenkins配置在远程服务器上执行shell脚本(两种方式)

Jenkins配置在远程服务器上执行shell脚本 方式一&#xff1a;通过SSH免密方式执行 说明&#xff1a;Jenkins部署在ServerA&#xff1a;10.1.1.74上&#xff0c;要运行的程序在ServerB&#xff1a;10.1.1.196 分两步 第一步&#xff1a;Linux Centos7配置SSH免密登录 Linux…...

Java+SpringBoot,打造社区疫情信息新生态

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…...

js ES6判断字符串是否以某个字符串开头或者结尾startsWith、endsWith

1.前言 startsWith&#xff1a;startsWith方法用于检查字符串是否以指定的字符串开头。 endsWith&#xff1a;endsWith方法用于检查字符串是否以指定的字符串结尾。 2.用法示例 const str Hello, world!;console.log(str.startsWith(Hello)); // true console.log(str.starts…...

预研项目完成后小批量验证(技术变更流程)

...

Bert-as-service 实战

参考&#xff1a;bert-as-service 详细使用指南写给初学者-CSDN博客 GitHub - ymcui/Chinese-BERT-wwm: Pre-Training with Whole Word Masking for Chinese BERT&#xff08;中文BERT-wwm系列模型&#xff09; 下载&#xff1a;https://storage.googleapis.com/bert_models/…...

微信小程序(四十七)多个token存储

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1.基础存储模板 2.中括号实现变量名匹配 源码&#xff1a; app.js App({//提前声明的变量名token:wx.getStorageSync(toke),refreshToken:wx.getSystemInfoAsync(refreshToken),setToken(key,token){//保存token到全局…...

ant-design-vue Table+Form实现动态表单验证:自定义规则与必填项触发实战

1. 动态表单验证的核心场景 在管理后台开发中&#xff0c;表格内嵌表单的需求非常常见。比如我们需要批量编辑商品信息&#xff0c;或者动态添加多行联系人数据时&#xff0c;传统的做法是在表格外单独做表单&#xff0c;但这样会导致操作流程割裂。ant-design-vue的TableForm组…...

Beyond Compare 5密钥生成器:免费获取永久授权的完整教程

Beyond Compare 5密钥生成器&#xff1a;免费获取永久授权的完整教程 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 还在为Beyond Compare 5的30天试用期到期而烦恼吗&#xff1f;想要继续使用…...

别再只用看门狗了!用STM32的PVD功能给你的低功耗设备加个‘离线通知器’

基于STM32 PVD的智能离线通知系统设计指南 引言 在物联网设备设计中&#xff0c;电池供电的可拆卸设备面临一个独特挑战&#xff1a;如何优雅地通知系统中的其他设备自己即将断电。传统解决方案往往依赖看门狗或定期心跳包&#xff0c;但这些方法要么反应迟钝&#xff0c;要么消…...

LeetCode 1653. 使字符串平衡的最少删除次数 详细技术解析

LeetCode 1653. 使字符串平衡的最少删除次数 详细技术解析 **标签&#xff1a;**LeetCode | 字符串 | 动态规划 | 前缀和 | 贪心 | 中等难度 **核心考点&#xff1a;**字符串平衡条件理解、动态规划状态设计、前缀和优化、贪心思想应用&#xff08;应对1e5级数据量&#xff09;…...

保姆级教程:用HBuilderX + DevEco Studio搞定UniApp鸿蒙真机调试与证书签名

从零到一&#xff1a;UniApp鸿蒙开发全流程实战指南 鸿蒙生态的崛起为跨平台开发带来了新的机遇与挑战。作为开发者&#xff0c;我们既兴奋于这个全新操作系统带来的可能性&#xff0c;又不得不面对环境配置、调试适配等一系列技术难题。本文将带你系统性地攻克UniApp鸿蒙开发中…...

Scroll Reverser:终极macOS滚动方向智能调节解决方案

Scroll Reverser&#xff1a;终极macOS滚动方向智能调节解决方案 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser Scroll Reverser是一款专门为macOS设计的智能滚动方向调节工具&…...

PDF文本提取与NER训练全流程

1. PDF文本提取与预处理 首先&#xff0c;需要从PDF文档中提取文本内容&#xff0c;并进行清洗和结构化处理&#xff0c;为NER训练准备数据。 1.1 PDF文本提取方法对比 提取工具适用场景优点缺点pdfminer.six复杂版式PDF支持中文、表格提取速度较慢PyPDF2简单文本提取轻量快…...

从PoseCNN到Yolo-6D:2018年那几篇6D位姿估计论文,现在回头看还香吗?

从PoseCNN到Yolo-6D&#xff1a;2018年经典6D位姿估计算法的技术遗产与当代启示 在计算机视觉的发展历程中&#xff0c;2018年堪称6D位姿估计领域的"黄金年份"。这一年&#xff0c;PoseCNN、DOPE和Yolo-6D三篇里程碑式论文相继问世&#xff0c;为物体6D位姿&#xff…...

混沌映射在信息安全中的应用实战:以图像加密和伪随机数生成为例

混沌映射在信息安全中的实战应用&#xff1a;从图像加密到随机数生成 混沌系统看似无序的表象下隐藏着精妙的确定性规律&#xff0c;这种特性使其成为信息安全领域的天然盟友。想象一下&#xff0c;当你需要保护一张包含敏感信息的图片&#xff0c;或是生成无法预测的随机数序列…...

大模型修炼秘籍 第十章:多才多艺——多任务微调

第十章&#xff1a;多才多艺——多任务微调多任务修多才艺&#xff0c;混合数据需平衡。【本章导读】 真正的大模型应该文能提笔安天下&#xff0c;武能上马定乾坤。多任务微调让模型学会多种技能&#xff0c;成为全能选手。一、一专多能 【任务类型】任务类型描述示例文本生成…...