十一、Redis持久化-RDB、AOF
Redis提供了两种持久化数据的方式。一种是RDB
快照,另一种是AOF
日志。RDB
快照是一次全量备份,AOF
日志是连续的增量备份。RDB
快照是以二进制的方式存放Redis
中的数据,在存储上比较紧凑;AOF
日志记录的是对内存数据修改的指令文本记录。Redis
提供的持久化机制,可以有效的避免Redis
因为进程退出导出的数据丢失问题。
1、RDB快照持久化
RDB
持久化是在某个时间点做一次全量的数据备份。触发RDB
持久化的方式分为手动触发和自动触发。
1.1、手动触发
手动触发分别对应save
和bgsave
命令
- 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
快照持久化。
- 执行
bgsave
命令时,Redis
主进程会检查是否有子进程在执行RDB/AOF持久化任务,如果有的话,直接返回。 Redis
主进程会fork一个子进程来执行RDB
的持久化操作,fork操作会阻塞主进程(影响Redis的读写),fork操作完成之后,会发消息给主进程,从而不再阻塞主进程。(阻塞主进程只在fork子进程时,后续的子进程处理操作都不会阻塞主进程);通过 info stats 命令可以查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。- 主进程fork完子进程后,bgsave命令会返回“BackGround saving started”信息,并不再阻塞主进程,可以继续响应其他命令。
- 子进程创建
RDB
文件,根据主进程生成临时快照文件,持久化完成后会使用临时快照文件替换掉原来的RDB文件(该过程不会影响主进程的读写,但Redis的写操作不会同步到主进程的内存中,而是会写到一个临时的内存区域作为一个副本)。执行lastsave命令可以获取最后一次生成的RDB时间,对应info统计的rdb_last_save_time选项。 - 子进程完成RDB持久化后会发消息给主进程,通知RDB持久化完成(同时将上阶段内存副本中的增量写数据同步到主内存中)。
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
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统计信息中查看。
当Redis
重启时,可以加载AOF文件进行数据恢复。
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快照,另一种是AOF日志。RDB快照是一次全量备份,AOF日志是连续的增量备份。RDB快照是以二进制的方式存放Redis中的数据,在存储上比较紧凑;AOF日志记录的是对内存数据修改的指令文本记录…...

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

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

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

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.合同总价问题 问承包商的利润是? 实际利润目标利润(目标成本-实际成本)*卖方分担比例 解:10 000(100 000 - 90 000)* 0.2 12 000(元) 实际成本有时也写作最终成本,问承…...

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

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

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

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

Day50代码随想录动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
Day50 动态规划part12 股票问题 309.最佳买卖股票时机含冷冻期 leetcode题目链接:309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 题意:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算…...

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

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

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

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

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

二进制转为HEX数组小工具
在使用RA8889时,JPG的解码只能从FLASH的DMA通道获取,那么如果要从远端、或者SD卡等处读取JPG图片出来显示怎么办? RA8889支持JPG图片硬解码,但数据流是从FLASH进行DMA读取的,然后再进行解码。因此这种情况下ÿ…...

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

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

java线程局部变量使用方式
线程局部变量是Java中用于存储线程本地信息的变量。这种变量仅在线程的生命周期内存在,并且每个线程都有自己的一份拷贝。换句话说,线程局部变量是线程私有的,其他线程无法访问。 使用场景主要包括: 1. 存储线程状态信息ÿ…...
【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙
【简介】几乎所有的人都知道,防火墙自带的硬盘是用来保存日志,以方便在出现问题时能找到原因。但是很少的人知道,防火墙自带的硬盘其实还有另一个功能,那就是用于WAN优化。 防火墙自带的硬盘 在FortiGate防火墙A、B、C、D系列&…...

2024数维杯数学建模B题生物质和煤共热解问题的研究原创论文分享
大家好,从昨天肝到现在,终于完成了2024数维杯数学建模挑战赛B题的完整论文啦。 实在精力有限,具体的讲解大家可以去讲解视频: 2024数维杯数学建模B题煤共热解每一问高质量完整代码讲解!_哔哩哔哩_bilibili 2024数维杯…...

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

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

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

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

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

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

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