“Redis中的持久化:深入理解RDB与AOF机制“
目录
# 概念
1. RDB持久化
1.1 备份是如何执行的(RDB过程)
1.2 配置文件信息
1.3 RDB持久化操作
1.4 RDB优势
1.5 RDB劣势
1.6 RDB做备份
2. AOF持久化
2.1 AOF开启及使用
2.2 异常恢复
2.3 配置文件操作
2.4 AOF持久化流程
2.5 优点
2.6 劣势
# 概念
-
redis持久化概念
redis是我们的内存数据,存在内存中的,但是redis也可以写道硬盘中去,这个过程就叫持久化;
-
RDB与AOF的优先级
AOF和 RDB 同时开启,系统默认取 AOF的数据(数据不会存在丢失);
1. RDB持久化
-
概念
就是在指定的时间间隔中将内存中的数据集快照写入到磁盘中(硬盘是磁盘的一种),比如每个10秒写入一次,再过10秒写入一次等;
1.1 备份是如何执行的(RDB过程)
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何I0操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB 的缺点是最后一次持久化后的数据可能丢失;
-
Fork:
Fork 的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程;
在 Linux 程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会 exec 系统调用,出于效率考虑,Linux 中引入了“写时复制技术”;
一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程;
dump.rdb文件:

1.2 配置文件信息
配置文件存在:vim /etc/redis.conf
![]()
一、stop-writes-on-bgsave-error yes(当redis无法写入磁盘,直接关闭redis写操作,推荐yes)

二、rdbcompression yes(对于存储到磁盘中的快照,设置是否进行压缩存储)
对于存储到磁盘中的快照,设置是否进行压缩存储。如果是,redis会采用LZF算法进行压缩;
如果不想消耗CPU进行压缩,可以设置为关闭此功能,推荐yes;

三、rdbchecksum检查完整性(存储快照后让redis使用CRC64算法进行数据校验)
推荐yes;

四、Save秒钟(写操作次数)
- 在 Redis 的配置文件中,
save命令用于配置数据库的 RDB(Redis Database)持久化策略。它定义了在特定时间间隔内,如果发生了一定数量的键改变,Redis 将触发持久化操作,将数据保存到磁盘中。
这三条配置定义了 Redis 在以下条件下触发持久化的规则:
save 900 1:- 时间间隔: 900秒(15分钟)。
- 键改变数量: 至少1个键。
- 解释: 如果在900秒内,至少有1个键发生了变化(被修改、删除或新增),Redis 将触发一次持久化操作,将数据保存到磁盘。
save 300 10:- 时间间隔: 300秒(5分钟)。
- 键改变数量: 至少10个键。
- 解释: 如果在300秒内,至少有10个键发生了变化,Redis 将触发一次持久化操作,将数据保存到磁盘。
save 60 10000:- 时间间隔: 60秒(1分钟)。
- 键改变数量: 至少10000个键。
- 解释: 如果在60秒内,至少有10000个键发生了变化,Redis 将触发一次持久化操作,将数据保存到磁盘。
-
运行原理
Redis 会在后台持续监视键的变化。如果在指定的时间间隔内键的变化次数达到设置的数量,Redis 就会创建一个 RDB 快照。这个快照包含当前数据库状态的一个副本并将其写入磁盘,以便于恢复数据。配置多个
save条目可以根据不同的条件灵活地触发持久化操作。 -
配置的意义和影响
- 灵活的持久化策略: 不同时间间隔和键改变数量的配置使得 Redis 能够灵活处理持久化操作。在频繁变化的情况下(如
save 60 10000),它能快速保存数据;而在变化较少的情况下(如save 900 1),则不会频繁触发持久化,减少性能开销。 - 数据持久化: 这些配置确保了 Redis 的数据能够定期持久化到磁盘中,以防止数据丢失。
- 性能权衡: 更频繁的持久化会导致更多的磁盘 I/O,从而影响性能;而较少的持久化则可能在崩溃时导致更多的数据丢失。
- 灵活的持久化策略: 不同时间间隔和键改变数量的配置使得 Redis 能够灵活处理持久化操作。在频繁变化的情况下(如

五、save VS bgsave
-
save:
工作机制:
- 同步操作:
save是一个同步操作,阻塞当前 Redis 实例,直到保存过程完成。 - 数据持久化: 它会生成一个 RDB (Redis Database) 快照文件,将当前的内存数据保存到磁盘。
优缺点:
- 优点: 操作简单,适合在 Redis 启动期间使用,确保启动时的数据被持久化。
- 缺点: 由于是同步操作,期间 Redis 将不能处理其他请求,可能导致性能问题,尤其在数据量大时。
典型使用场景:
- 紧急保存: 在进行数据恢复操作之前确保数据不丢失。
- 开发和调试: 当需要手动触发保存数据以查看具体状态时。
示例:
SAVE - 同步操作:
-
bgsave:
工作机制:
- 异步操作:
bgsave是一个异步操作,Redis 主进程会 fork 一个子进程来执行数据持久化。 - 数据持久化: 子进程会生成一个 RDB 快照文件,将当前的内存数据保存到磁盘,而主进程继续处理客户端的请求。
优缺点:
- 优点: 不阻塞 Redis 主进程,允许 Redis 继续处理其他请求,适合在运行时定期保存数据。
- 缺点: fork 操作在数据量大时可能会占用较多的系统资源,并且对系统内存开销较大。
典型使用场景:
- 定期备份: 在运行时定期进行数据备份,减少持久化对性能的影响。
- 大规模应用: 适合需要频繁持久化数据且不希望阻塞请求处理的大规模应用。
示例:
BGSAVE - 异步操作:
-
主要区别总结
| 特性 | save | bgsave |
|---|---|---|
| 操作模式 | 同步 | 异步 |
| 阻塞行为 | 阻塞 | 非阻塞 |
| 系统资源 | 较少 | 较多 |
| 执行时机 | 手动 | 手动或自动配置 |
| 性能影响 | 高 | 低 |
1.3 RDB持久化操作

设置key:

写入后查询(证明做了持久化操作):

1.4 RDB优势
适合大规模的数据恢复;
对数据完整性和一致性要求不高更适合使用;
节省磁盘空间;
恢复速度快;
1.5 RDB劣势
Fork 的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑;
虽然 Redis.在 fork 时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能;
在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉的话就会丢失最后一次快照后的所有修改;
1.6 RDB做备份

我们在移除前先做一个插入操作,以上操作后重新启动redis,在删除dump文件后,进入复制的文件中查看,这时候就有之前设置的3个key了(save 20 3)这个是备份恢复过程;

2. AOF持久化
-
概念
(Append Only File:在redis中的另一种持久化的方式)
以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行-次以完成数据的恢复工作;
2.1 AOF开启及使用

开启后就会有默认文件:appendonly yes


使用(在开启完后在redis中set入值,这时候文件的大小发生了变化 )

2.2 异常恢复
修改默认的 appendonly no,改为 yes;
如遇到 AOF文件损坏,通过/usr/local/bin/redis-check-aof--fix appendonly.aof 进行恢复;
作用:备份被写坏的 AOF 文件;
恢复:重启 redis,然后重新加载;
2.3 配置文件操作
1. AOF同步步率设置
appendfsync always:始终同步,每次Redis的写入都会立刻记入日志;虽然性能较差,但数据完整性比较好;
appendfsync everysec:每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失;
appendfsync no:redis不主动进行同步,把同步时机交给操作系统;

2. rewrite压缩
-
rewrite是什么:
AOF 采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF 文件的大小超过所设定的阈值时,Redis 就会启动 AOF 文件的内容压缩 , 只保留可以恢复数据的最小指令集,可以使用命令 bgrewriteaof;
-
重写原理,如何实现重写:
AOF 文件持续增长而过大时,会 fork 出一条新进程来将文件重写(也是先写临时文件最后rename),redis4.0 版本后的重写,是指上就是把 rdb 的快照,以二级制的形式附在新的 aof头部,作为已有的历史数据,替换掉原来的流水账操作;
3. no-appendfsync-on-rewrite :AOF 是否继续同步数据到磁盘
在 Redis 中,no-appendfsync-on-rewrite 配置选项,与 AOF(Append Only File)持久化和 RDB(Redis Database)持久化的相互作用相关。这个选项控制了在执行 RDB 快照的同时,AOF 是否继续同步数据到磁盘;
no-appendfsync-on-rewrite 的值为 no 时(默认情况):
- AOF 重写期间继续 ****
fsync: 在进行 RDB 持久化(快照)或 AOF 重写时,Redis 将继续按照appendfsync配置进行fsync操作,将 AOF 缓冲区中的数据同步到磁盘。 - 保持 AOF 持久化的完整性: 即使在进行快照或 AOF 重写期间,也不会延迟或暂停 AOF 文件的同步操作,确保 AOF 文件的实时性和数据完整性。
no-appendfsync-on-rewrite 的值为 yes 时:
- AOF 重写期间暂停 ****
fsync: 在进行 RDB 持久化或 AOF 重写时,Redis 会暂停fsync操作。这意味着在持久化操作期间,AOF 文件的数据不会实时同步到磁盘。 - 降低磁盘 I/O 负载: 通过暂停
fsync,可以减轻磁盘 I/O 负载,减少系统压力和潜在的性能影响,适合 I/O 密集型应用或磁盘性能有限的环境。

2.4 AOF持久化流程
(1)客户端的请求写命令会被append追加到 AOF 缓冲区内;
(2)AOF缓冲区根据 AOF持久化策略[always,everysec,no]将操作sync 同步到磁盘的AOF文件中;
(3)AOF文件大小超过重写策略或手动重写时,会对 AOF 文件rewrite 重写,压缩AOF 文件容量;
2.5 优点
备份机制更稳健,丢失数据概率更低;
可读的日志文本,通过操作 AOF文件,可以处理误操作;
2.6 劣势
比起 RDB 占用更多的磁盘空间;
恢复备份速度要慢;
每次读写都同步的话,有一定的性能压力;
存在个别 Bug,造成不能恢复;
相关文章:
“Redis中的持久化:深入理解RDB与AOF机制“
目录 # 概念 1. RDB持久化 1.1 备份是如何执行的(RDB过程) 1.2 配置文件信息 1.3 RDB持久化操作 1.4 RDB优势 1.5 RDB劣势 1.6 RDB做备份 2. AOF持久化 2.1 AOF开启及使用 2.2 异常恢复 2.3 配置文件操作 2.4 AOF持久化流程 2.5 优点 2.6…...
PHP框架详解:Symfony框架讲解
PHP作为一种流行的服务器端编程语言,拥有众多框架,其中Symfony是备受开发者推崇的一个强大框架。本文将详细讲解Symfony框架的特点、优势及其主要组件和用法。 一、Symfony简介 Symfony是由Fabien Potencier于2005年创建的一个开源PHP框架。它基于MVC&…...
PR软件视频抠图换背景
1 新建项目 2 新建序列 在项目的右下角有个图标,新建 序列 序列是视频的制作尺寸,根据自己的需要选择 3 新建颜色遮罩 在项目的右下角--新建颜色遮罩--选择黑色--确定 4 导入视频 把要导入视频的文件夹打开,把视频拖到 项目 里 把黑色遮罩拖…...
下载依赖有问题(只有自己有问题)
有缓存! 删除node_modules 命令:npm run clean 前提是该项目支持这个命令:package.json > scripts 内有 clean 例如下面这个就没有clean,则直接手动删除 清除缓存 npm cache clean --force pnpm store prune删除lock文件 …...
vscode-关闭ts与js语义校验
1.ts与js语义校验 TypeScript(TS)和JavaScript(JS)在语义校验方面有很大的不同。TypeScript是一种静态类型检查的编程语言,它是JavaScript的一个超集,为JavaScript添加了类型系统和其他一些特性。而JavaScr…...
风控中的文本相似方法之余弦定理
一、余弦相似 一、 余弦相似概述 余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。 从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。结…...
Spring Boot定时任务编程指南:如何创建和配置周期性任务
🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 🔥 微信:zsqtcyw 联系我领取学习资料 …...
Java 获取客户端 IP 地址【工具类】
Java 获取客户端 IP 地址 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress;/*** 网络工具类*/ public class NetUtils {/*** 获取客户端 IP 地址** param request 请求* return {link String}*/public static String getIpAddress(HttpServletReq…...
区块链中nonce是什么,什么作用
目录 区块链中nonce是什么,什么作用 区块链中nonce是什么,什么作用 Nonce在以太坊中是一个用于确保交易顺序性和唯一性的重要参数。以下是对Nonce的详细解释: 定义 Nonce是一个scalar值,它等于从该地址发送的交易数量,或在具有关联代码的账户的情况下,由该账户创建的合…...
探索Python的多媒体解决方案:ffmpy库
文章目录 探索Python的多媒体解决方案:ffmpy库一、背景:数字化时代的多媒体处理二、ffmpy:Python与ffmpeg的桥梁三、安装ffmpy:轻松几步四、ffmpy的五项基本功能1. 转换视频格式2. 调整视频质量3. 音频转换4. 视频截图5. 视频合并…...
dmhs同步因目的端表自增列报错解决方法
dmhs同步因目的端表自增列报错解决方法 1 dmhs copy 装载数据时报错 HY000 CODE:-27232 配置源端捕获器cpt 1 dmhs copy 装载数据时报错 HY000 CODE:-2723 ERR:Only if specified in the column list and SET IDENTITY INSERT is ON, then identity column could be assigned …...
封装分发安装教程
【安装环境】 Linux伪静态 PHP7.1mysql5.6 SSL 证书 (使用宝塔) 1、在宝塔上面新建站点,把压缩包上传到根目录,解压出来,然后导入 sql 数据库文件,再 然后修改数据库配置 source\system\db_config.php 2、…...
redis从入门到进阶——数据类型、 操作、数值操作、发布订阅、消息队列、布隆过滤器、事务
文章目录 基础数据类型操作数值操作 进阶发布订阅消息队列布隆过滤器事务 基础 数据类型 string,set, hash, list, zset 操作 string符串类型: 保存一个字符串:set key value [EX seconds|PX milliseconds...] [NX|XX]EX:设置…...
剖析 Kafka 消息丢失的原因
文章目录 前言一、生产者导致的消息丢失的场景场景1:消息太大解决方案 :1、减少生产者发送消息体体积2、调整参数max.request.size 场景2:异步发送机制解决方案 :1、使用带回调函数的发送方法 场景3:网络问题和配置不当…...
阿里又出AI神器,颠覆传统图像编辑,免费开源!
文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 最近阿里开源了 Mi…...
git 大文本上传和下载git-lfs
1. ubuntu 1)下载脚本来自动化配置系统上的包存储库,导入签名密钥等过程。这些脚本必须在root下运行。 # apt/deb repos: curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash # curl -s https://packag…...
Ps:脚本与动作
有三种脚本语言可用于编写 Photoshop 脚本:AppleScript(macOS)、JavaScript 和 VBScript(Windows)。 Photoshop 脚本文件默认文件夹 Win:C:\Program Files\Adobe\Adobe Photoshop 2024\Presets\Scripts Mac…...
MySQL数据库回顾(1)
数据库相关概念 关系型数据库 概念: 建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 1.使用表存储数据,格式统一,便于维护 2.使用SQL语言操作,标准统一,使用方便 SOL SQL通用语法 …...
文字炫酷祝福 含魔法代码
效果下图:(可自定义显示内容) 代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…...
docker容器中连接宿主机mysql数据库
最近要在docker中使用mysql数据库,首先考虑在ubuntu的镜像中安装mysql,这样的脚本和数据库都在容器中,直接访问localhost:3306,脚本很简单,如下: import pymysql# 建立数据库连接 db pymysql.…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
