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 持久化的意义并与其他常见的缓存技术做了…...
数据库测试
TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较:TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化:如何提升数据库查询速度,揭秘实战技巧与挑战 引言 T…...
< 自用文儿 > Gobuster 暴力扫描工具与 SecLists 安全测试词表集合
Ethice 道德问题 GFW 的保护下,很多的设备操作系统是停留在更老的版本,应用软件也是,因此很多的漏洞没有被修复。通讯没有使用加密,例如网页没有使用 HTTPS 网站很多。几乎是半裸的在网络上等着被食。 不做恶是下限。 环境&…...
上海市计算机学会竞赛平台2024年4月月赛丙组排序分数
排序分数 内存限制: 256 Mb时间限制: 1000 ms 题目描述 给定正整数 nn,请按从小到大的顺序输出所有大于00 且小于 11 的,分母不超过 nn 的最简分数,例如 n5n5 时,输出: 15, 14, 13, 25, 12, 35, 23, 34, 45…...
【大语言模型笔记进阶一步】提示语设计学习笔记,跳出框架思维,自己构建提示词
一、大语言模型应用场景 1. 文本生成 文本创作: 诗歌故事,剧本,推文帖子 摘要与改写: 长文本摘要与简化,多语言翻译与本地化 结构化生成: 表格,根据需求生成代码片段,API文档生成…...
软件工程应试复习(考试折磨版)
针对学校软件工程考试,参考教材《软件工程导论(第6版)》1-8章 学习的艺术:不断地尝试,我一定会找到高效用的方法,让学习变成一门艺术,从应试备考中解救出我的时间同胞们。 好嘞!既然…...
关于网页地图的坐标系
EPSG:4326地理坐标系 和 EPSG:3857Web 墨卡托投影 EPSG:4326 定义:EPSG:4326 是基于 WGS84 椭球的地理坐标系,使用经度(Longitude)和纬度(Latitude)表示地球上的位置。特点: 经度范围为 -180 …...
环境会影响你的决策:K近邻算法(KNN)
环境会影响你的决策:K近邻算法(KNN) 1. 核心思想与流程 KNN是一种基于局部相似性的分类算法,核心思想是“近朱者赤”:待测样本的类别由其最近的k个邻居的多数类别决定。 关键步骤: 定义空间与距离:通常采…...
华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】
华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Node.js介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查…...
Vue 3 路由管理实战:构建多页面博客导航 - 掌握 Vue Router 实现 SPA 页面跳转
引言 欢迎再次回到 Vue 3 + 现代前端工程化 系列技术博客! 在昨天的第三篇博客中,我们深入探索了 Vue 3 响应式系统的进阶应用,通过构建简易购物车应用,熟练掌握了 watch 监听器和 computed 计算属性的运用。 今天,我们将开启 Vue 3 工程化实践的全新篇章,聚焦于构建单页…...
C语言整体梳理-基础篇-结构体
结构体详解 1.1结构体是什么? 结构体是一些值的集合,这些值成为成员变量,结构体的每个成员可以是不同类型的变量。 数组是相同类型的元素组成的集合,结构体可以是不同类型元素组成的集合。 1.2结构体的声明 1.2.1常规声明 s…...
MacBook 终端中使用 vim命令
在 MacBook 终端中使用 vim 编辑器时,以下是一些常用命令和操作指南: 1. 基本操作 启动 vim vim 文件名 # 打开或创建文件退出 vim 保存并退出: 按 Esc,然后输入 :wq,按 Enter。 不保存退出: 按 Esc&am…...
【 实战案例篇三】【某金融信息系统项目管理案例分析】
大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…...
springboot、deepseek4j、bge-m3和milvus
1、pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …...
会话与会话管理:Cookie与Session的深度解析
一、什么是会话? 二、Cookie:客户端存储技术 1. Cookie的工作原理 2、在后端设置cookie 3、在前端设置cookie 三、浏览器开启了cookie禁用怎么办? 一、什么是会话? 会话(Session)是指一个用户与服务器之间…...
etcd部署硬件资源推荐
etcd部署硬件资源推荐 原文:https://etcd.io/docs/v3.5/op-guide/hardware/ etcd 通常在开发或测试环境中运行良好,即使资源有限;在笔记本电脑或廉价云服务器上开发时,使用 etcd 也很常见。然而,在生产环境中运行 etcd…...
MAVlink链路环境搭建并解决“ModuleNotFoundError: No module named ‘xxx’”问题
MAVlink链路常用于云台相机与飞控以及地面站之间的数据传输,搭建MAVlink链路环境需要安装Python、Future、MAVLink、pymavlink四样工具用于生成mavlink代码。 Python 直接从官网下载默认安装即可https://www.python.org/downloads/ 在电脑命令行进行安装验证&#x…...
ROS2软件调用架构和机制解析:Publisher创建
术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准,是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口,提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略,控制通信的可靠性、历史记录、…...
Android -- 使用Sharepreference保存List储存失败,原因是包含Bitmap,drawable等类型数据
1.报错信息如下: class android.content.res.ColorStateList declares multiple JSON fields named mChangingConfigurations 2.Bean类属性如下: data class AppInfoBean( val appName: String?, val appIcon: Drawable, val appPackage: String?,…...
java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类
(以下内容全部来自上述课程) 1.抽象类 父类定义抽象方法后,子类的方法就必须重写,抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样…...
Go - 泛型的使用
泛型的语法 泛型为Go语言添加了三个新的重要特性: 函数和类型的类型参数。将接口类型定义为类型集,包括没有方法的类型。类型推断,它允许在调用函数时在许多情况下省略类型参数。 类型参数 类型参数的使用 除了函数中支持类型参数列表外,…...
蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)
[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛…...
内容中台的企业CMS架构是什么?
企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计,通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档,也能生成高并发的营销落地页,配合版本控制机制确保内…...
算法题(81):询问学号
审题: 需要我们根据给出的n值确定录入数据个数,然后根据给出的数据存储学号。再根据m值确定需要输出的学号个数,然后根据数组内容输出学号 思路: 我们可以利用数组进行数据顺序存储,以及随机读取完成本题 由于学号最大为1e9&#…...
React antd的datePicker自定义,封装成组件
一、antd的datePicker自定义 需求:用户需要为日期选择器的每个日期单元格添加一个Tooltip,当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码,确保Tooltip正确显示,并且数据…...
C++ AVL树详解(含模拟实现)
目录 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的旋转(难点) AVL树的验证 AVL树的删除(本文不做具体的模拟实现) AVL树的性能 AVL树的模拟实现 AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索…...
Spring Boot 3.x 系列【3】Spring Initializr快速创建Spring Boot项目
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言安装JDK 17创建Spring Boot 项目 方式1:网页在线生成方式2&#…...
Elasticsearch:过滤 HNSW 搜索,快速模式
作者:来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现,探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来,Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索,允许用户检索符合指定元数据…...
TCP长连接与短连接
TCP长连接与短连接 TCP(传输控制协议)中的长连接和短连接是两种不同的连接管理方式,各有优缺点: 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时,再重新建立连接。 特点࿱…...
【AI测试学习】AnythingLLM+Ollama+DeepSeek部署私人知识库
1.搭建DeepSeek大语言模型 1.1Ollama大预言模型部署 Ollama简化了大型语言模型的运行,让每个人都能在本地轻松体验AI的强大,打开浏览器-下载Ollama-输入命令-搞定,这是本地部署大语言模型的全新方式。 这里我们借助Ollama大预言模型部署工具进行搭建 官网如下:Ollama …...
