Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)
本部分内容是关于博主在学习 Redis 时关于持久化部分的记录,介绍了 RDB 和 AOF 两种持久化方式,详细介绍了持久化的原理、配置、使用方式、优缺点和使用场景。并对两种持久化方式做了对比。文章最后介绍了 Redis 持久化的意义并与其他常见的缓存技术做了对比。本文来源有视频课程记录,有其他博主的博客,也有 AI 查询等等。
Redis 作为一个缓存组件,是否需要持久化功能?持久化的是什么?有什么意义?让我们根据这几个问题去了解 Redis 的持久化。
首先,Redis 是一个服务,是服务就会出现重启,崩溃和宕机的情况,持久化的方式可以确保数据在 Redis 服务器重启或崩溃后能够恢复。所以持久化的作用还是很重要的,是确保数据在服务重启后能够恢复的关键机制。
接着说第二个问题,持久化的数据是什么?在解释这个问题的时候就要涉及到 Redis 持久化的方式了,不同的方式持久化的数据有所不同,其意义和使用场景也不同。Redis 的两种主要持久化方式是 RDB(Redis Database)
和 AOF(Append Only File)
。
一、RDB(Redis Database)
当选择使用 Redis 服务时,会默认选用一个方式进行持久化,这个方式一定是用于中小型项目体量,并且轻量化,易使用。RDB 就是 Redis 默认的持久化方式,它通过定期保存内存数据的快照到磁盘文件中,实现数据的持久化。
RDB 通过定期生成内存数据的快照(Snapshot)并将其保存到磁盘上的二进制文件中,实现数据的持久化。RDB 文件是一个压缩的二进制文件,默认命名为 dump.rdb
,它记录了 Redis 在某一时刻的内存数据状态。即 RDB 文件是二进制格式,存储的是 Redis 当前数据集的快照。
工作原理:在 Redis 配置文件 redis.conf
中,可以通过 save 指令设置快照保存的触发条件。
- 手动触发:使用
SAVE
(同步阻塞操作)或BGSAVE
(通过 fork 创建子进程进行持久化,不阻塞主线程)命令。 - 自动触发:通过配置 save 参数(如
save 900 1
,表示900秒内至少有1个键发生变化时自动保存快照)。
使用方式:在 Redis 配置文件中设置自动保存规则。
save 900 1 # 900秒内至少有1个键变化时保存快照
save 300 10 # 300秒内至少有10个键变化时保存快照
save 60 10000 # 60秒内至少有10000个键变化时保存快照
当触发条件满足时,Redis 会自动触发快照操作,会通过 fork 创建一个子进程,由子进程负责将当前内存中的数据写入到一个临时文件中。写入完成后,临时文件会替换之前的 RDB 文件。另外,RDB 文件以二进制格式存储,这种格式紧凑且加载速度快。
当 Redis 服务重启时,Redis 会加载 RDB 文件中的数据,将其恢复到内存中,从而恢复到上次快照时的状态。由于 RDB 文件是二进制格式且经过压缩,恢复速度较快,适合用于快速启动。
优点:
- 文件小:RDB 文件体积小,适合备份和全量复制。
- 恢复速度快:加载 RDB 文件恢复数据的速度非常快。
- 对性能影响小:通过子进程进行磁盘 I/O 操作,不会阻塞主线程。
缺点:
- 数据丢失风险:在两次快照之间,如果 Redis 服务器发生故障,可能会丢失部分数据。
- 快照操作可能阻塞:在数据量较大时,fork 子进程可能会导致短暂的阻塞。
适用场景:
- 数据备份:适合定期备份数据。
- 灾难恢复:快速恢复数据。
- 全量复制:用于 Redis 主从复制中的数据同步。
RDB 持久化通过定期生成内存数据的快照并保存到磁盘文件中,确保 Redis 服务重启后能够快速恢复数据。它适用于对数据丢失容忍度较高且需要快速恢复的场景。对于对数据安全性要求更高的场景,可以结合 AOF 持久化或使用混合持久化策略。
二、AOF(Append Only File)
如果该方式不是默认的话,说明该方式会应对大型项目,体量大。AOF 持久化通过记录每次写操作的命令到日志文件中,实现数据的持久化。AOF 文件是一个纯文本文件,记录了所有修改 Redis 数据的命令,格式与 Redis 的命令行协议一致。
使用方式:在 Redis 配置文件中启用 AOF 并设置同步策略。
appendonly yes
appendfsync everysec # 这表示启用 AOF 持久化,并每秒同步一次。
AOF 的工作原理可以分为以下几个步骤:
- 命令追加(Command Appending):
- 每次执行写操作时,Redis 将命令追加到内存中的缓冲区 aof_buf。
- 缓冲区的内容会根据配置的同步策略写入到 AOF 文件中。
- 文件同步(File Syncing):根据
appendfsync
的配置,Redis 提供三种同步策略。- always:每次写操作后立即同步到磁盘,数据最安全,但性能开销最大。
- everysec:每秒同步一次,性能和数据安全性平衡。
- no:由操作系统决定同步时机,性能最高,但可能丢失更多数据。
- 文件重写(File Rewriting):
- AOF 文件会随着操作的增加而变大,Redis 提供了 AOF 重写机制来压缩文件大小。
- 重写过程由
BGREWRITEAOF
命令触发,Redis 会创建一个子进程,将当前内存中的数据以最小化的方式重写到一个新的 AOF 文件中。 - 自动重写可以通过配置
auto-aof-rewrite-percentage
和auto-aof-rewrite-min-size
参数实现。
- 重启加载(Loading on Restart):
- 当 Redis 重启时,会加载 AOF 文件中的命令并逐条执行,以恢复数据。
- 如果同时启用了 RDB 和 AOF,Redis 会优先加载 AOF 文件。
当 Redis 服务重启时,通过重放 AOF 文件中的命令,Redis 可以恢复到最近一次写操作的状态。即使在 Redis 服务崩溃时,AOF 也能保证数据的完整性,最多丢失最后一次同步前的数据,具有高数据安全性。
优点:
- 高数据安全性:AOF 提供了更高的数据安全性,尤其是在使用
everysec
或always
同步策略时。 - 可读性高:AOF 文件是文本格式,记录了实际的 Redis 命令,便于阅读和分析。
- 支持修复工具:如果 AOF 文件损坏,可以使用
redis-check-aof
工具进行修复。 - 灵活的同步策略:用户可以根据需求选择不同的同步策略,平衡性能和数据安全性。
缺点:
- 文件较大:AOF 文件记录了所有写操作,文件体积通常比 RDB 文件大。
- 恢复速度慢:恢复数据时需要逐条重放命令,速度较慢。
- 性能开销:高频磁盘写入可能影响 Redis 的写入性能。
适用场景
- 高数据安全性:适用于对数据丢失容忍度低的场景,如金融系统、订单系统。
- 写操作频繁:适合写操作频繁且需要实时持久化的场景。
- 调试和审计:AOF 文件记录了详细的命令日志,便于开发和测试中的调试。
AOF 持久化通过记录每个写操作的命令,提供了高数据安全性和灵活性。它适用于对数据丢失敏感的场景,但可能会带来较大的文件体积和恢复速度较慢的问题。在实际应用中,AOF 可以与 RDB 混合使用,以兼顾数据安全性和恢复速度。
三、汇总
持久化方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
RDB | 文件小、恢复速度快、对性能影响小 | 数据丢失风险、快照操作可能阻塞 | 数据备份、灾难恢复、全量复制 |
AOF | 数据安全性高、文件可读性强、支持修复 | 文件较大、恢复速度慢、性能开销 | 数据安全性要求高、误操作恢复 |
如果需要高数据安全性,建议使用 AOF;如果需要快速恢复和较小的磁盘占用,建议使用 RDB。
四、Redis 对比其他缓存技术
Redis 的持久化功能是其作为缓存系统的一个重要特性,相比其他缓存技术(如 Memcached、Guava Cache、Caffeine 等),Redis 的持久化功能在某些场景下具有显著优势。
Redis 的持久化功能具有以下优势。
- 数据持久化:Redis 提供了两种主要的持久化方式:RDB(快照)和 AOF(追加文件),以及混合持久化(RDB + AOF)。这些持久化方式确保了数据在 Redis 服务器重启或崩溃后能够恢复。相比之下,Memcached 和 Guava Cache 等缓存技术不支持持久化,数据在重启后会丢失。
- 高数据安全性:AOF 持久化通过记录每个写操作,确保即使在 Redis 崩溃时,也能恢复到非常接近崩溃时的状态。这种高数据安全性使得 Redis 在金融、交易系统等对数据完整性要求极高的场景中具有明显优势。
- 快速恢复:RDB 持久化通过快照文件快速恢复数据,适合需要快速启动的场景。混合持久化(RDB + AOF)结合了两者的优点,既保证了数据的完整性,又提高了恢复速度。
- 灵活的配置:Redis 允许用户根据需求选择不同的持久化策略。例如,AOF 的
appendfsync
参数可以设置为always
、everysec
或no
,以平衡数据安全性和性能。
Redis 的持久化功能存在一定的开销。
- 性能开销:AOF 持久化需要频繁写入磁盘,可能会影响 Redis 的写入性能。
- 文件大小:AOF 文件通常比 RDB 文件大,尤其是在写操作频繁的情况下。
- 恢复速度:AOF 恢复数据时需要重放所有命令,速度较慢。
Redis 与 Memcached 对比:
- 持久化:Redis 支持持久化,而 Memcached 不支持。
- 数据结构:Redis 支持多种数据结构(如字符串、哈希、列表、集合等),而 Memcached 仅支持简单的键值对。
- 适用场景:Redis 适合需要持久化和复杂数据结构的场景,而 Memcached 更适合简单的缓存需求。
Redis 与 Guava Cache/Caffeine 对比:
- 本地缓存 vs 分布式缓存:Guava Cache 和 Caffeine 是本地缓存,不支持分布式。Redis 是分布式缓存,支持多节点共享数据。
- 持久化:Guava Cache 和 Caffeine 不支持持久化。
- 适用场景:对于单机应用,Guava Cache 或 Caffeine 是高性能的选择;对于分布式系统,Redis 是更好的选择。
各种缓存技术的使用场景:
- Redis:适用于需要高可用性、数据持久化和复杂数据结构的场景,如分布式系统、电商系统、实时数据处理等。
- Memcached:适用于简单的缓存需求,如网页缓存。
- Guava Cache/Caffeine:适用于单机应用,尤其是需要高性能本地缓存的场景。
Redis 的持久化功能使其在需要数据安全性和高可用性的场景中具有显著优势,但这种优势也带来了性能开销和文件大小的增加。在选择缓存技术时,应根据具体需求权衡数据安全性、性能和成本。对于分布式系统和复杂数据结构的需求,Redis 是更优的选择。
相关文章:

Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)
本部分内容是关于博主在学习 Redis 时关于持久化部分的记录,介绍了 RDB 和 AOF 两种持久化方式,详细介绍了持久化的原理、配置、使用方式、优缺点和使用场景。并对两种持久化方式做了对比。文章最后介绍了 Redis 持久化的意义并与其他常见的缓存技术做了…...
spring boot 连接FTP实现文件上传
spring boot 连接FTP实现文件上传 maven: <!--ftp--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency>接口示例: ApiO…...
怎么进行mysql的优化?
MySQL 的优化是一个系统性的工作,涉及多个层面,包括查询优化、索引优化、配置优化、架构优化等。以下是一些常见的 MySQL 优化方法: 查询优化 避免全表扫描:确保查询能够使用索引,避免 SELECT *,只选择需要…...

Octave3D 关卡设计插件
课程参考链接 这位大佬有在视频合集中有详细的讲解,个人体验过,感觉功能很强大 https://www.bilibili.com/video/BV1Kq4y1C72P/?share_sourcecopy_web&vd_source0a41d8122353e3e841ae0a39908c2181 Prefab资源管理 第一步 在场景中创建一个空物体…...

【论文笔记-TPAMI 2024】FreqFusion:用于密集图像预测的频率感知特征融合
Frequency-aware Feature Fusion for Dense Image Prediction 用于密集图像预测的频率感知特征融合 Abstract:密集图像预测任务要求具有强类别信息和高分辨率精确空间边界细节的特征。为了实现这一点,现代分层模型通常利用特征融合,直接添加…...

DeepBI成单关键词管理策略:提升转化与曝光,助力电商业绩双增长
在电商竞争愈发激烈的市场环境中,优化广告投放的关键词管理是提升产品转化率和曝光量的关键。特别是对于那些已经证明其转化能力的成单关键词,如何更好地管理和优化,成为了卖家们亟需解决的问题。DeepBI通过一套智能化的管理方案,…...

ai-3、机器学习之逻辑回归
机器学习之逻辑回归 1、分类问题2、逻辑回归2.1、二分类问题线性回归2.2、二分类问题逻辑回归 1、分类问题 分类问题常用的算法:逻辑回归 y0 :垃圾邮件 y1:正常邮件 准确来说是分类任务与线性回归任务的区别 2、逻辑回归 2.1、二分类问题线性回归 分类…...

在kubernetes集群中持续压测 SpringCloud 应用,pod 的 memory cache 持续增长问题
问题描述 在kubernetes集群中压测 SpringCloud 应用,持续压测, pod 的 memory cache 持续增长,导致 pod 最终挂了。上图看看效果吧~pod的资源配置 cpu: 1~2 core内存:1~3 G pod 数:1分析思路 1)pod 级的 Memory Cache ,显示的为当前 pod 的 linux 系统的 cache 内存的…...
金融赋能绍兴纺织 民生银行助力外贸中小微企业“走出去”
在浙江绍兴,纺织业作为一张熠熠生辉的产业名片,承载着深厚的历史底蕴与蓬勃的发展活力。这里依傍长三角经济圈,交通网络纵横交错,将原材料产地与广阔市场紧密相连;产业集群高度成熟,上下游产业链完备&#…...
ubuntu:换源安装docker-ce和docker-compose
更新apt源 apt换源:ubuntu:更新阿里云apt源-CSDN博客 安装docker-ce 1、更新软件源 sudo apt update2、安装基本软件 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common lrzsz -y3、指定使用阿里云镜像 su…...
基于 Elasticsearch 和 Milvus 的 RAG 运维知识库的架构设计和部署落地实现指南
最近在整理一些业务场景的架构设计和部署落地实现指南 先放一个 【基于RAG的运维知识库 (ElasticSearch + Milvus) 的详细实现指南】,其中包含了详尽的技术实现细节、可运行的示例代码、原理分析、优缺点分析和应用场景分析。 架构描述: 基于RAG的运维知识库 (ElasticSearch…...

基于Python的web漏洞挖掘,漏洞扫描系统(附源码,部署)
本次技术通过利用Python技术来开发一款针对web漏洞挖掘扫描的技术,通过web漏洞的挖掘扫描来实现对网站URL的漏洞检测,通过高中低风险的判断来实现对一款网站中存在的漏洞进行可视化的分析,从而能够找到问题并且尽快的实现问题的解决。 博主介…...

Spring Boot全局异常处理:“危机公关”团队
目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理(附上代码实例)三、总结: 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢…...

Wireshark:自定义类型帧解析
文章目录 1. 前言2. 背景3. 开发 Lua 插件 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 Wireshark 不认识用 tcpdump 抓取的数据帧,仔细分析相关代码和数据帧后,…...

Redis7——进阶篇(一)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...

word转换为pdf后图片失真解决办法、高质量PDF转换方法
1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker (1)点击word选项卡上的Acrobat插件,(2)点击“首选项”按钮,(3)点击“高级配置”按钮(4)点…...
Kafka零拷贝
Kafka为什么适用零拷贝,其他存储结构不适用? Kafka 采用的是日志存储模型,数据通常是顺序写入、顺序读取,并且它的消费模式是 “读完即走”(一次性读取并发送给消费者),这与零拷贝的特性完美匹…...
鸿蒙应用开发入门教程
鸿蒙应用开发入门教程 基础准备与环境搭建 1. 了解鸿蒙系统 1.1 核心理念学习 HarmonyOS(鸿蒙系统)是华为推出的全场景分布式操作系统,其核心特点如下: 分布式能力 设备协同:手机、平板、智能手表、IoT设备等可无…...

【2022——暴力DP / 优雅背包】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long;const int N 2023;ll f[2][2023][2023];int main() {f[0][0][0] 1;for(int i 1; i < 10; i) //次数{for(int j 0; j< 2022; j)for(int k 0; k < 2022; k)f[i&1][j][k] 0…...

AI智能体与大语言模型:重塑SaaS系统的未来航向
在数字化转型的浪潮中,软件即服务(SaaS)系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型(LLMs)的迅速发展,SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...