Redis系列-2 Redis持久化机制

news2024/11/23 6:40:18

背景:

服务器重启后会丢失内存中的全部数据,内存数据库如果没有持久化机制,难以保证数据的可靠性,如Memcached。Redis提供了RDB(基于全量)和AOF(基于增量)两种持久化机制,一方面可以保证数据的可靠性,当服务器意外宕机重启后,Redis从持久化文件中读取数据,可以快速恢复到宕机前的状态;另外,基于持久化文件可以实现数据备份、数据扩展和搭建Redis集群。

1.RDB

RDB持久化当前内存快照的数据,属于全量同步。RDB有两种触发类型: 当Redis客户端执行save命令时,使用Redis主进程进行持久化,会阻塞此期间的用户请求;当Redis客户端执行bgsave命令或者配置文件中save规则触发持久化时,通过创建子进程并将持久化任务委托给子进程,从而不会阻塞Redis主线程。持久化完成后会生成一个持久化文件dump.rdb文件, 文件内容是二进制数据。当RDB开启而AOF关闭,重启服务时,Redis会根据dump.rdb文件恢复内存数据。
save规则可通过redis.conf配置文件或通过命令形式:

# 查看save规则
traffic:0>config get save
1) "save"
2) "900 1 300 10 60 10000"

# 清空save规则
traffic:0>config set save ""
"OK"
traffic:0>config get save
1) "save"
2) ""

# 新增save规则
traffic:0>config set save "900 1"
"OK"
traffic:0>config get save
1) "save"
2) "900 1"

“save 900 1"持久化规则表示每900秒内有key进行了修改,触发持久化;将save设置为""时,表示关闭RDB。
另外,dir(持久化存放文件路径)和dbfilename(持久化文件名称)是受保护的配置,不可通过config set命令修改。

RDB实现机制

在这里插入图片描述
如上图所示,通过bgsave指令或者save规则(本质也是bgsave指令)触发,Redis主进程会创建一个子进程,将RDB持久化操作委托给子进程处理, 子进程将内存快照写入临时dump.rdb文件,之后替换原有的dump.rdb文件。其中,Redis主进程fork子进程时会阻塞,且内存越大阻塞时间越长。

内存快照
Redis主进程fork子进程时,子进程共享主进程的所有内存信息,如下图所示:
在这里插入图片描述
通过CopyOnWrite技术,Redis数据库信息在内存中仅保存一份:主进程修改数据时,复制一份副本并在副本的基础上进行修改,未修改的部分与之前保持一致。当主进程将内存中0x3b地址的值由4改成400时,有如下变化:
在这里插入图片描述
当主进程对0x3b的数据写操作时,系统的CopyOnWrite机制将复制0x3b数据至0x3f, 并将主进程的内存地址由0x3b切换至0x3f; 主进程对0x3f进行写操作,数据由4修改为40。
需要注意的是,主进程未修改部分内存地址无变化,子进程全部内存地址无变化。因此,子进程被fork后,Redis主进程的数据变化对子进程不可见,子进程保留了被fork瞬间主进程的全部内存信息, 也叫做内存快照。
在这里插入图片描述
子进程将该部分内存快照(0x34,0x38,0x3b)持久化写入dump.rdb文件,而主进程改动的部分(4->400)未被写入RDB文件,改动部分将在下次RDB时持久化,如果下次RDB前Redis服务被重启,可能存在数据丢失的风险。
在这里插入图片描述
绿色部分表示正在持久化的内存数据(RDB子进程的内存快照),黄色部分表示Redis待持久化的部分(Redis主进程修改的部分)。如果快照数据较大,持久化时间较长,待持久化的数据积累越多,此时Redis重启会丢失大量的数据。因此,为保障数据的可靠性,RDB一般与AOF结合使用。

2.AOF

一般而言,POSIX 标准的 I/O 库,因直接使用内核缓冲区(涉及用户态和内核态的来回切换),适合小文件的读写;而封装的C语言标准IO库,使用用户态缓存区(无需切换内核形态),更适合大文件的读写。AOF据此将内核缓冲区和用户缓冲区分别用于AOF持久化和重写AOF持久化文件。下文仅用缓存区指代,不再区分。

与RDB全量同步不同,AOF(Append Only File只追加文件), 向文件中增量追加变化(类似mysql的binlog),AOF的流程如下所示:
在这里插入图片描述
AOF持久化可以分为以下两个部分。
(1) 将数据写入缓存区
当Redis主线程完成内存修改后,将修改数据写入到缓存区;这部分也会占据主线程的时间。
(2) 将缓存刷入硬盘
当Redis主线程将数据写入缓存区后,根据配置的持久化策略确定是否调用 flushAppendOnlyFile方法将缓存数据刷入硬盘。之前提到的aof的配置项appendfsync表示持久化策略,有三个取值:always—每次修改都进行持久化(立即调用);everysec—每秒持久化一次(每秒调用一次);no不主动持久化(不调用),由系统决定。
数据刷入磁盘后,生成一个AOF文件,可通过如下配置配置文件名称:

#开启AOF, 默认是no关闭状态
appendonly yes

#配置aof的文件名
appendfilename "appendonly.aof"

# aof持久化策略: everysec表示每秒持久化一次, always每次修改都进行持久化
appendfsync everysec

当RDB关闭,而AOF开启:重启Redis时,redis会根据AOF的持久化文件(appendonly.aof)恢复内存数据。
当RDB和AOF都开启时:优先使用AOF持久化文件恢复数据;如果AOF文件不存在或者损坏,再尝试使用RDB持久化文件恢复数据。

rewrite

每个操作都会记录在appendonly.aof文件中,会导致文件变大且存放很多无意义的中间操作。

traffic:0>set key1 value1
"OK"
traffic:0>set key1 value2
"OK"
traffic:0>del key1
"1"

Redis经理上述新增、修改和删除key1键后,内存不变化,但是AOF文件内容如下所示:

*2
$6
SELECT
$1
0
*3
$3
set
$4
key1
$6
value1
*3
$3
set
$4
key1
$6
value2
*2
$3
del
$4
key1

为解决该问题,Redis引入rewrite重写机制。

rewrite可以通过redis.conf配置文件的auto-aof-rewrite-percentage和auto-aof-rewrite-min-size确定触发频率:

#需要二者同时满足,才会触发
# aof文件增长达到上一次的100%时才会触发
auto-aof-rewrite-percentage 100
# aof需要大于64M才会触发
auto-aof-rewrite-min-size 64mb

触发rewrite后,流程如下所示:
在这里插入图片描述
[1] 主进程fork出子进程(阻塞),然后继续工作;
[2] 与RDB相同,子进程此刻拥有与主进程的全部内存信息,子进程将该部分信息写入临时AOF文件;
[3] 在此期间,主进程会接收数据库操作指令并修改内存数据库,此时,Redis主进程会将该部分指令数据写入重写缓存区和AOF缓冲区(写入AOF文件);
[4] 当子进程将快照写完时,重写缓存区中累积的数据写入临时AOF;
[5] 使用临时AOF替换原AOF文件;
这里有个细节需要注意:子进程将重新缓存数据写入到临时AOF文件之前,需要先向主进程发送消息:“暂时不要发数据给我”,此过程中累积的消息后续会直接更新到AOF文件中。

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

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

相关文章

38-4 Web应用防火墙 - WAF的使用及规则

准备:38-3 Web应用防火墙 - 安装配置WAF-CSDN博客 WAF的使用 启动 Nginx /usr/local/nginx/sbin/nginx 为了测试未启动 ModSecurity 时的访问效果,我们可以模拟攻击。要查看当前虚拟机的 IP 地址,可以使用命令 ifconfig 浏览器中访问ip,如果要在真实机中访问就需要关闭…

Sqlserver批量迁移Job

因为切换物理机,需要把数据库的作业从A机器迁移到B机器,数据库整体备份还原就可以了,数据库上的作业不会跟着带过去,需要手动创建,作业数量太多,逐一创建太浪费时间,Microsoft SQL Server Manag…

M2M设备、消费设备、IoT设备

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题,欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 您提供的链接指向一篇关于GSMA SGP.32标准,即eSIM物联网(IoT)标准的文章。以下是文章的主要内容概述: ##…

JAVA基础之Swing窗体的几种布局

1、边框布局BorderLayout 特点:5个方位(东(East)南(north)西(west)北(south)中(center)) 是一种简单的布局策略。 使用时,应将其看成一个“组件”。 同样,首先应通…

工业项目组态用这个开源软件ScadaBR

软件介绍 ScadaBR 是一个开源软件,提供完整的 SCADA(Supervisory Control and Data Acquisition,监控与数据采集)系统的所有功能。SCADA 类型的软件自60年代末开始存在,并且在涉及机器、可编程逻辑控制器(P…

【Linux入门】基础开发工具

本篇博客整理了Linux(centOS版本)中基础开发工具的用途和用法,旨在透过开发工具的使用,帮助读者更好地理解可执行程序的编写、编译、运行等。 目录 一、软件包管理器 yum 1.软件的下载与安装 2.Linux应用商店:yum …

ElementUI从unpkg.com完整下载到本地的方法 - 解决unpkg.com不稳定的问题 - 自建镜像站 - 不想打包只想cdn一下

方法 方法1)随便弄个文件夹,根据官网npm方法下载包,提取即可 npm i element-ui -S cd /node_modules/element-ui/ ls src 安装npm方法:https://nodejs.org/en 方法2)不推荐 - 在github中搜索对应的库zip包&#xff0…

webpack基础---常用loader

webpack 命令式和配置文件 html-webpack-plugin 配置项:{ templete: filename: inject: } 清除上次打包的文件,output: { clear: true } mode选项: none development prodution souce-map:可以精准定位代码行数 { devt…

基于51单片机的交通灯设计—夜间、紧急、复位、可调时间、四个数码管显示

基于51单片机的交通灯设计 (仿真+程序+原理图+PCB+设计报告) 功能介绍 具体功能: 1、采用四方向数码管设计,更加符合真实的交通信号灯设计; 2、左侧按键从上到下依次…

VMware中安装Ubuntu死机 - 笔记

1VMware中安装Ubuntu,使用十几分钟后出现突然卡顿的情况怎么解决? VMware中安装Ubuntu,使用十几分钟后出现突然卡顿的情况怎么解决?_vmware上ubuntu卡-CSDN博客 其他情况 如果出现系统提示不支持该虚拟化,则打开“启…

深入教程:在STM32上实现能源管理系统

引言 能源管理系统(EMS)在提高能源效率、减少能源消耗和支持可持续发展方面起着关键作用。本教程将介绍如何在STM32微控制器上开发一个能源管理系统,这种系统能够监控和控制能源使用,适用于家庭自动化、工业控制系统以及任何需要…

Docker Compose如何安装

Docker Compose的安装通常依赖于你的操作系统。以下是在不同操作系统中安装Docker Compose的方法: Linux 系统 //下载最新版本的Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(un…

京东初级运营必修课程,从零开始学习(49节课)

课程内容: 01.1.全面解析店铺后台的各项功能 02.2.商品要素的重要性及如何打造黄金标题 03.3.手把手带你完成商品上架 04.4.为啥你的流量不转化-诸葛 05.5.怎么策划一张高点击率的照片 06.6.内功优化之数据化标题创建 07.7.内功优化之如何高转化活动落地页 …

【硬件模块】DHT11数字式温湿度传感器模块

前言 今天在这边新开一个系列,那就是硬件模块。 后续会把之前写过的硬件模块再写一遍,因为之前都是使用的STM32来驱动模块的,而现在我快速上手ESP32系列也快结束了,因此我在原本文章的基础上再加上使用ESP32来驱动的部分构成硬件…

傅里叶变换的推导过程-part1三角函数的正交性

1. 三角函数的正交性 1.0 提出问题 1.1 普通向量的正交 1.2 普通函数的正交 1.3 证明三角函数正交为0 1.3.1 cosnx.conmx = 0 , (m!=n) 1.3.2 cosmx.sinnx = 0 , s

【c++】继承学习(一):继承机制与基类派生类转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来学习继承部分 目录 1.继承的概念和定义继承的定义继承基类成员的访问方式变化 2.基类和派生类对象赋值转换3.继承中的作用域 1.继承的概念和定义 …

JAVA 学习·泛型(二)——通配泛型

有关泛型的基本概念&#xff0c;参见我的前一篇博客 JAVA 学习泛型&#xff08;一&#xff09;。 协变性 泛型不具备协变性 在介绍通配泛型之前&#xff0c;先来看一下下面的例子。我们定义了一个泛型栈&#xff1a; import java.util.ArrayList; class GenericStack<E>…

python 11Pandas数据可视化实验

实验目的&#xff1a; 学会使用Pandas操作数据集&#xff0c;并进行可视化。 数据集描述&#xff1a; 该数据集是CNKI中与“中药毒理反应”相关的文献信息&#xff0c;包含文章题目、作者、来源&#xff08;出版社&#xff09;、摘要、发表时间等信息。 实验要求&#xff1…

建设智慧校园,让师生生活更便捷

在时代快速发展的大背景下&#xff0c;建设智慧校园是学校发展的要求&#xff0c;也是广大师生更加期待的。智慧校园建设是集教学、科研、管理、学习、生活为一体的高度智能化的学习生活环境。整合、整合、优化资源&#xff0c;提高工作、学习、科研效率&#xff0c;提高学校管…

java递归-(迷宫问题)

前面 这里我们来玩个有趣的事情&#xff0c;链接是0221_韩顺平Java_老鼠出迷宫1_哔哩哔哩_bilibili 我们要找的是小老鼠按路径走到右下点 要点 我们这里方法调用时对于引用类型&#xff1a;如java中引用数据类型有哪些&#xff1f;_java引用数据类型-CSDN博客 会共享引用类型…