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

十一、Redis持久化-RDB、AOF

Redis提供了两种持久化数据的方式。一种是RDB快照,另一种是AOF日志。RDB快照是一次全量备份,AOF日志是连续的增量备份。RDB快照是以二进制的方式存放Redis中的数据,在存储上比较紧凑;AOF日志记录的是对内存数据修改的指令文本记录。Redis提供的持久化机制,可以有效的避免Redis因为进程退出导出的数据丢失问题。

1、RDB快照持久化

RDB持久化是在某个时间点做一次全量的数据备份。触发RDB持久化的方式分为手动触发自动触发。

1.1、手动触发

手动触发分别对应savebgsave命令

  • save命令:会阻塞当前Redis服务器,直到RDB过程完成为止,如果数据量较大的话,会造成长时间的阻塞,线上环境不建议使用。
  • bgsave命令:就是background save。执行bgsave命令时Redis主进程会fork一个子进程来进行数据的备份,完成后自动结束(操作系统的copy on write机制,简称COW)。所以Redis主进程阻塞时间只在fork阶段那一会。相对于save命令,阻塞时间更短。

1.2、自动触发

  • 配置redis.conf,触发规则,自动执行
# 当在规定的时间内,Redis发生了写操作的个数满足条件,会触发发生BGSAVE命令。
# save <seconds> <changes>
# 当用户设置了多个save的选项配置,只要其中任一条满足,Redis都会触发一次BGSAVE操作
save 900 1 
save 300 10 
save 60 10000
# 以上配置的含义:900秒之内至少一次写操作、300秒之内至少发生10次写操作、
# 60秒之内发生至少10000次写操作,只要满足任一条件,均会触发bgsave
  • 执行shutdown命令关闭服务器时,如果没有开启AOF持久化功能,那么会自动执行一次bgsave命令。
  • 如果从节点执行全量复制操作,主节点会自动执行bgsave命令生成RDB文件并发送给从节点。更多细节见主从同步。
  • 执行debug reload命令重新加载Redis时,也会自动触发save操作。

1.3、RDB执行流程

Redis使用操作系统的多进程(Copy On Write, COW)机制来实现RDB快照持久化。

  1. 执行bgsave命令时,Redis主进程会检查是否有子进程在执行RDB/AOF持久化任务,如果有的话,直接返回。
  2. Redis主进程会fork一个子进程来执行RDB的持久化操作,fork操作会阻塞主进程(影响Redis的读写),fork操作完成之后,会发消息给主进程,从而不再阻塞主进程。(阻塞主进程只在fork子进程时,后续的子进程处理操作都不会阻塞主进程);通过 info stats 命令可以查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。
  3. 主进程fork完子进程后,bgsave命令会返回“BackGround saving started”信息,并不再阻塞主进程,可以继续响应其他命令。
  4. 子进程创建RDB文件,根据主进程生成临时快照文件,持久化完成后会使用临时快照文件替换掉原来的RDB文件(该过程不会影响主进程的读写,但Redis的写操作不会同步到主进程的内存中,而是会写到一个临时的内存区域作为一个副本)。执行lastsave命令可以获取最后一次生成的RDB时间,对应info统计的rdb_last_save_time选项。
  5. 子进程完成RDB持久化后会发消息给主进程,通知RDB持久化完成(同时将上阶段内存副本中的增量写数据同步到主内存中)。

image.png

1.4、RDB优缺点

1.4.1、优点

  • RDB文件小(二进制,存储比较紧凑),非常适合定时备份,用于灾难恢复。
  • Redis加载RDB文件的速度比AOF快很多,因为RDB文件中直接存储的是内存数据,而AOF文件中存储的是一条条命令,需要重新执行一遍。

1.4.2、缺点

  • RDB无法做到实时持久化,若在两次bgsave命令间宕机,则会丢失两次执行区间内的增量数据,不适合用于实时性要求较高的场景。
  • RDB的cow机制中,fork子进程属于重量级操作,并且会阻塞主进程
  • RDB文件使用特定的二进制格式保存,Redis版本演化过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB文件格式的问题。

2、AOF日志持久化

AOF(append only file)持久化:以独立日志的方式记录每次的写命令,重启时需要重新执行一遍AOF文件中的命令来达到恢复数据的目的。AOF日志会在持续运行中逐渐增大,由于Redis重启过程需要优先加载AOF日志进行指令重放以恢复数据,恢复时间会无比漫长。所以需要定期进行AOF重写,对AOF日志进行瘦身(合并命令),目前AOF是Redis的主流持久化方式。

2.1、开启方式

AOF默认是关闭的,通过redis.conf配置文件进行开启。

## 此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
## 只有在“yes”下,aof重写/文件同步等特性才会生效  
appendonly yes  ## 指定aof文件名称  
appendfilename appendonly.aof  ## 指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec  
appendfsync everysec  
## 在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”  
no-appendfsync-on-rewrite no  ## aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”  
auto-aof-rewrite-min-size 64mb  ## 相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比  
## 每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A)
## aof文件增长到A*(1 + p)之后,触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。  
auto-aof-rewrite-percentage 100

image.png
AOF是对文件的操作,因此对于变更比较频繁的服务,那么会造成磁盘的IO负荷加重。此外因为Linux对文件的操作是采用‘延迟写入’的方式,因此并非每次对文件的write操作都会立即写入到磁盘中,而是进入到一个buffer中,当buffer中的数据达到阈值时,就会触发实际写入(也有其他时机),这是Linux对文件系统的优化。
同时Linux也提供fsync(int fd)函数,可以用来将指定文件的内容强制刷新到磁盘中。只要Redis进程实时调用fsync函数就可以保证AOF日志的内容不会丢失。但是fsync是个磁盘IO操作,他很慢!如果Redis执行一条指令就要执行fsync一次,那么Redis的性能就会收到很大的影响。
因此,Redis在其配置文件中提供了3中策略,用来同步AOF日志记录:

  • always:每一条AOF指令都立即同步到磁盘文件中,性能很低,但是很安全。
  • everysec:每秒同步一次,性能和安全都比较中庸,也是Redis推荐的方式。如果遇到服务器宕机的情况,最多会丢失1s的AOF日志记录。
  • no:Redis永不直接调用fsync文件同步,而是将文件同步操作交给系统来决定,何时同步磁盘。性能较好,但是不安全。

2.2、重写(rewrite)机制

随着Redis运行时间的增长,AOF日志文件会越来越大,为了解决这个问题,Redis需要定期对AOF日志进行重写,来对AOF日志文件进行瘦身。
AOF Rewrite虽然是‘压缩’AOF文件的过程,但是并非是采用‘基于原AOF文件’进行重写或者压缩操作的。而是类似RDB快照的方式:基于Copy On Write,全量遍历内存中的数据,然后逐个序列化到文件汇总。因此AOF rewrite能够正确反映当前内存数据的状态。
AOF重写(bgrewriteaof)和ADB(bgsave)过程类似,都是fork一个子进程来进行处理。
AOF对日志文件进行压缩时,为了防止单条命令过大造成客户端缓冲区溢出,对于list、set、zset、hash等类型操作,以64个元素为界进行拆分成多条。
AOF重写降低了文件的大小,另一方面,更小的文件可以更快的被Redis加载。

在重写过程中,对于新的变更操作将仍然被写入到原AOF文件中,同时这些新的变更操作也会被Redis收集起来(aof-rewrite-buffer)。当内存中的数据全被写入到新的AOF文件后,收集的新的变更操作也会一并追加到新AOF文件中。然后将新的AOF文件命名为appendonly.aof,使用新的AOF文件替换掉老的AOF文件。

2.3、触发机制

RDB类似,AOF也有两种触发机制**:手动触发自动触发**。

2.3.1、手动触发

直接调用bgrewriteaof命令。

redis-cli -h ip -p port bgrewriteaof

2.3.2、自动触发

根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机:

auto-aof-rewrite-min-size:表示运行AOF文件重写时的文件最小体积,默认为64MB。
auto-aof-rewrite-percentage:代表当前AOF文件空间(auto_current_size)和上一次重写后AOF文件空间(aof_base_size)的值

自动触发时机=auto_current_size>auto_aof_rewrite_min_size && (auto_current_size-auto_base_size)/auto_base_size >= auto_aof_rewrite_percentage
其中aof_current_size和aof_base_size可以在info Persistence统计信息中查看。
image.png

Redis重启时,可以加载AOF文件进行数据恢复。
image.png

2.4、AOF优缺点

2.4.1、优点

AOF只是追加写入文件,对服务器性能影响较小,速度比RDB要快,消耗的内存较少。

2.4.2、缺点

  • AOF方式生成的日志文件会越来越大,因此需要不断的进行AOF重写,进行瘦身。
  • 即使经过AOF重写,由于文件是文本文件,文件提交较大(相比较于二进制文件)。
  • AOF重写命令式的恢复数据,速度明显比RDB慢。

3、Redis 4.0混合式持久化

  • 仅使用RDB快照方式恢复数据,由于快照时间粒度较大,会丢失大量的数据。
  • 仅使用AOF重放方式恢复数据,日志性能相对于RDB来说慢。且需要不停的进行日志的重写。在Redis实例很大的情况下,启动需要花费很长的时间。

Redis 4.0为了解决这个问题,带来一个全新的持久化选项–**混合持久化。**将RDB的内容和增量的AOF日志文件放在一起。这里的AOF日志不再是全量的日志,而是自持久化开始到持久化结束的这段时间发生的增量AOF日志,通常这部分AOF日志很小。相当于:

  • 大量数据使用粗粒度(时间上)的rdb快照方式,性能高,回复时间快。
  • 增量数据使用细粒度(时间上)的AOF日志,尽量保证数据不丢失。

Redis重启时,可以先加载RDB文件,然后在重放AOF日志就可以完全替代之前的AOF全量文件重放,重启效率因此大幅度提升。

相关文章:

十一、Redis持久化-RDB、AOF

Redis提供了两种持久化数据的方式。一种是RDB快照&#xff0c;另一种是AOF日志。RDB快照是一次全量备份&#xff0c;AOF日志是连续的增量备份。RDB快照是以二进制的方式存放Redis中的数据&#xff0c;在存储上比较紧凑&#xff1b;AOF日志记录的是对内存数据修改的指令文本记录…...

Oracle闪回数据库【Oracle闪回技术】(二)

理解Oracle闪回级别【Oracle闪回技术】(一)-CSDN博客 Oracle默认是不开启闪回数据库的。如果开启闪回数据库的前提条件是,开启Oracle归档模式并启用闪回恢复区。 因为闪回日志文件存放在闪回恢复区中,如果在RAC环境下,必须将闪回恢复区存储在集群文件或者ASM文件中。 一…...

简单负载均衡

题目描述 某工程师为了解决服务器负载过高的问题&#xff0c;决定使用多个服务器来分担请求消息。 现给定 k 台服务器&#xff08;编号从 1 到 k&#xff09;&#xff0c;以及一批请求消息的信息&#xff0c;格式为到达时刻 负载大小&#xff0c;消息说明&#xff1a; 每个时刻…...

Portforge:一款功能强大的轻量级端口混淆工具

关于Portforge Portforge是一款功能强大的轻量级端口混淆工具&#xff0c;该工具使用Crystal语言开发&#xff0c;可以帮助广大研究人员防止网络映射&#xff0c;这样一来&#xff0c;他人就无法查看到你设备正在运行&#xff08;或没有运行&#xff09;的服务和程序了。简而言…...

1.8. 离散时间鞅-无界停时定理与随机游走

无界停时定理与随机游走 无界停时定理与随机游走1. 无界停时定理1.1. 一致可积1.2. 非一致可积2. 应用于随机游动-鞅方法2.1. 随机游走构造的鞅2.2. 对称简单随机游走无界停时定理与随机游走 1. 无界停时定理 本节给出一致可积下鞅的无界停时定理,说明一致可积下鞅的停止过程…...

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…...

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是&#xff1f; 实际利润目标利润&#xff08;目标成本-实际成本&#xff09;*卖方分担比例 解&#xff1a;10 000&#xff08;100 000 - 90 000&#xff09;* 0.2 12 000&#xff08;元&#xff09; 实际成本有时也写作最终成本&#xff0c;问承…...

ARP欺骗使局域网内设备断网

一、实验准备 kali系统&#xff1a;可使用虚拟机软件模拟 kali虚拟机镜像链接&#xff1a;https://www.kali.org/get-kali/#kali-virtual-machines 注意虚拟机网络适配器采用桥接模式 局域网内存在指定断网的设备 二、实验步骤 打开kali系统命令行&#xff1a;ctrlaltt可快…...

Android动画(四):PathMeasure实现路径动画

文章概览 1 PathMeasure概述2 实现路径加载动画3 实现箭头加载动画4 实现操作成功动画 本系列将介绍以下内容&#xff1a; Android动画 1 PathMeasure概述 PathMeasure是一个单独的类&#xff0c;其全部源码如下&#xff08;请详细研读注释&#xff09;&#xff1a; package…...

HTTP 连接详解

概述 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的&#xff0c;客户端可以打开一条TCP/IP连接&#xff0c;连接到任何地方的服务器。一旦连接建立&#xff0c;客户端和服务器之间交换的报文就永远不会丢失、受损或失序 TCP&#xff08;Transmission Control Protocol&…...

练习题(2024/5/12)

1二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…...

Day50代码随想录动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

Day50 动态规划part12 股票问题 309.最佳买卖股票时机含冷冻期 leetcode题目链接&#xff1a;309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 题意&#xff1a;给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。设计一个算…...

【软考】scrum的步骤

目录 1. 明确产品愿景和需求2. 制定计划和任务列表3. 进行迭代开发&#xff08;Sprint&#xff09;4. Sprint评审会议5. Sprint回顾会议6. 重复迭代 1. 明确产品愿景和需求 1.这个过程通常由项目所有者和利益相关者参与&#xff0c;目的是确保整个团队对项目的目标和方向有清晰…...

【C语言】编译与链接

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 引言 一、翻译环境 1.1 编译 1.1.1 预处理 1.1.2 编译 …...

Consul 注册的服务地址变成了 127.0.1.1

问题 我们的服务一直用 Consul 作为注册中心&#xff0c;在 AWS 和 阿里云上使用的时候&#xff0c;没出现过问题。最近把一些服务迁到腾讯云的时候&#xff0c;遇到一个问题&#xff1a;注册的服务地址都是 127.0.1.1。 127.0.1.1 这个地址我们平时遇到的比较少&#xff0c;…...

数字水印 | 离散小波变换 DWT 的 Python 代码实现

&#x1f34d;原文&#xff1a; 【图像处理】图像离散小波变换及 Python 代码实现 &#x1f34d;写在前面&#xff1a; 本文在原文的基础上补全了代码。 1 环境准备 ① 安装 p y w t \mathsf{pywt} pywt 包&#xff1a; pip install PyWavelets说明&#xff1a; p y w t \…...

[框架] Unity 公共执行器

本篇我们通过使用单例模式来创建一个公共执行器&#xff0c;使得原本应该在Update()、FixedUpdate()中的指令都可以统一放在一个对象中执行&#xff0c;且可进行添加和移除操作。 1. 创建单例模式改造器&#xff1a;SingletonMono 我们先创建一个单例模式改造器&#xff0c;使…...

二进制转为HEX数组小工具

在使用RA8889时&#xff0c;JPG的解码只能从FLASH的DMA通道获取&#xff0c;那么如果要从远端、或者SD卡等处读取JPG图片出来显示怎么办&#xff1f; RA8889支持JPG图片硬解码&#xff0c;但数据流是从FLASH进行DMA读取的&#xff0c;然后再进行解码。因此这种情况下&#xff…...

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…...

C++11 新特性 decltype 说明符

一、typeof与typeid 1.1、typeof 在C11标准之前&#xff0c;GCC已经提供了一个类似功能的运算符 typeof对类型进行推导&#xff0c;但是这毕竟是编译器的实现&#xff0c;不是标准。 int a 0; typeof(a) b 5;1.2、typeid C标准提供了 typeid 运算符&#xff0c;获取的类型…...

java线程局部变量使用方式

线程局部变量是Java中用于存储线程本地信息的变量。这种变量仅在线程的生命周期内存在&#xff0c;并且每个线程都有自己的一份拷贝。换句话说&#xff0c;线程局部变量是线程私有的&#xff0c;其他线程无法访问。 使用场景主要包括&#xff1a; 1. 存储线程状态信息&#xff…...

【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙

【简介】几乎所有的人都知道&#xff0c;防火墙自带的硬盘是用来保存日志&#xff0c;以方便在出现问题时能找到原因。但是很少的人知道&#xff0c;防火墙自带的硬盘其实还有另一个功能&#xff0c;那就是用于WAN优化。 防火墙自带的硬盘 在FortiGate防火墙A、B、C、D系列&…...

2024数维杯数学建模B题生物质和煤共热解问题的研究原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024数维杯数学建模挑战赛B题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024数维杯数学建模B题煤共热解每一问高质量完整代码讲解&#xff01;_哔哩哔哩_bilibili 2024数维杯…...

中国电子学会(CEIT)2022年12月真题C语言软件编程等级考试三级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试一级 2022年12月 编程题五道 总分:100分一、鸡兔同笼(20分) 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至…...

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月12日,星期日

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年5月12日 星期日 农历四月初五 1、 全国多地已推“一次挂号管三天”&#xff0c;部分医院专家门诊适用。 2、 在梅大高速塌方事故中拦车、救援&#xff0c;黄曼秋等5人拟确认为见义勇为。 3、 深圳新能源车指标申请条件调…...

微服务思想以及实现

文章目录 前言一、什么时候需要拆分微服务1. 创业型项目2. 大型项目 二、怎么拆1. 拆分目标2. 拆分方式 三、微服务之间远程调用1. 实现方式2. 手动发送Http请求&#xff08;RestTemplate&#xff09;3. 服务注册中心3.1 原理3.2 Nacos注册中心3.3 服务注册3.4 服务发现(Discov…...

C语法:格式符号%f和%lf引发的错误

今天编程时有如下代码&#xff1a; #include"stdio.h"int main(void) {double profit;double bonus;printf("请输入本月利润\n");scanf("%f",&profit);//错误&#xff1a;此行profit是double类型&#xff0c;格式符为%f,当输入8时&#xff0…...

Java基础入门day48

day48 JDBC调用关系 tomcat 简介 tomcat是Apache下的一个核心项目&#xff0c;免费开源&#xff0c;支持servlet和jsp。 tomcat技术先进&#xff0c;性能稳定&#xff0c;目前比较流行的web应用服务器 安装 官网&#xff1a; Apache Tomcat - Welcome! 下载 tomcat8.5 解压&a…...

C++笔记(体系结构与内核分析)

1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起&#xff0c;目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开&#xff0c;可以将任何容器与任何算法结合使用&#xff0c;只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …...

c++ 唤醒指定线程

在C中&#xff0c;直接唤醒一个特定的线程并不像在Java的Thread类中有interrupt()方法或者某些操作系统特定的API&#xff08;如POSIX的pthread_cond_signal或Windows的SetEvent&#xff09;那样简单。C标准库没有提供一个直接的方法来"唤醒"一个正在等待的线程。然而…...