Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)


Redis
本部分内容是关于博主在学习 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 是更优的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/diannao/71988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中lshw相关的命令

​ lshw(List Hardware)是一个在 Linux 系统中用于显示硬件详细信息的强大工具。以下是一些常见的 lshw 相关命令及其用法: 1. 安装 lshw 在使用 lshw 之前,你可能需要先安装它。不同的 Linux 发行版安装方式有所不同&#xff1…

爬虫第九篇-结束爬虫循环

最近在学习Python爬虫的过程中,遇到了一个很有趣的问题:如何优雅地结束爬虫循环?今天,我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时,我们经常会遇到这样的情况:当爬取到的…

Vue3状态管理新选择:Pinia使用完全指南

一、为什么需要状态管理? 在Vue应用开发中,当我们的组件树变得复杂时,组件间的数据传递会成为棘手的问题。传统方案(如props/$emit)在多层嵌套组件中会变得笨拙,这时状态管理工具应运而生。Vue3带来了全新…

一文掌握模拟登录的基本原理和实战

文章目录 1. 模拟登录的基本原理1.1 登录流程1.2 关键技术2. 模拟登录的实战步骤2.1 分析登录页面2.2 使用 Requests 实现模拟登录2.3 处理验证码2.4 使用 Selenium 实现模拟登录3. 实战案例:模拟登录豆瓣3.1 分析豆瓣登录页面3.2 实现代码4. 注意事项5. 总结模拟登录是爬虫开…

推荐算法工程师的技术图谱和学习路径

推荐算法工程师的技术图谱和学习路径可以从多个维度进行概述,可以总结如下: 一、技术图谱 推荐算法工程师需要掌握的技术栈主要分为以下几个方面: 数学基础: 微积分、线性代数、概率论与统计学是推荐算法的基础,用于理解模型的数学原理和优化算法。高等数学、最优化理论…

ONNX转RKNN的环境搭建

将ONNX模型转换为RKNN模型的过程记录 工具准备 rknn-toolkit:https://github.com/rockchip-linux/rknn-toolkit rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2 rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo ultralytics_yolov8:https://github…

华为认证考试证书下载步骤(纸质+电子版)

华为考试证书可以通过官方渠道下载相应的电子证书,部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下: ①访问华为培训与认证网站 打开浏览器,登录华为培训与认证官方网站 ②登录个人账号 在网站首页,点…

面试八股文--数据库基础知识总结(2) MySQL

本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…

介绍下pdf打印工具类 JasperPrint

JasperPrint 工具类深度解析 JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类,其本质是 填充数据后的可打印报表对象,承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析: 一、核心定位与生命周…

LVS+Keepalived 高可用集群搭建

一、高可用集群: 1.什么是高可用集群: 高可用集群(High Availability Cluster)是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响…

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站,内容通俗易懂,讲解风趣幽默,简直让人欲罢不能。忍不住分享给大家,点击这里立刻跳转,开启你的AI学习之旅吧! 前言 – 人工智能教程https://www.captainbed.cn/l…

银河麒麟高级服务器操作系统在线调整/pro/{PID}/limits文件中nofile的软限制和硬限制参数值操作方法

银河麒麟高级服务器操作系统在线调整/pro/{PID}/limits文件中nofile的软限制和硬限制参数值操作方法 一 系统环境二 使用场景三 操作步骤 一 系统环境 [rootlocalhost ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server…

数据结构-直接插入和希尔排序

这次,我们来讲数据结构的排序的直接插入。 一:排序的思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 相当于,我们打牌如上图…

基于coze+微信小程序的ai对话

界面介绍&#xff1a; 代码&#xff1a;&#xff08;替换你的coze的配置&#xff09; <template><view class"container"><!-- 高斯模糊背景 --><view class"animated-bg"><view class"gradient-blob"></view…

Day11,Hot100(贪心算法)

贪心 &#xff08;1&#xff09;121. 买卖股票的最佳时机 第 i 天卖出的最大利润&#xff0c;即在前面最低价的时候买入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…

Linux内核自定义协议族开发指南:理解net_device_ops、proto_ops与net_proto_family

在Linux内核中开发自定义协议族需要深入理解网络协议栈的分层模型。net_device_ops、proto_ops和net_proto_family是三个关键结构体,分别作用于不同的层次。本文将详细解析它们的作用、交互关系及实现方法,并提供一个完整的开发框架。 一、核心结构体的作用与层级关系 struct…

SpringBoot 中的 Redis 序列化

SpringBoot 中的 Redis 序列化 在 Spring Boot 中&#xff0c;Redis 的序列化是指将 Java 对象转换为字节流&#xff08;序列化&#xff09;以便存储到 Redis 中&#xff0c;以及从 Redis 中读取字节流并将其转换回 Java 对象&#xff08;反序列化&#xff09;。 这是因为在 R…

vLLM服务设置开机自启动(Linux)

要在开机时进入指定的 conda 环境并启动此 vllm 服务&#xff0c;您可以通过以下步骤设置一个 systemd 服务来自动执行脚本。 一、第一步&#xff1a;创建一个启动脚本 1.打开终端并创建启动脚本&#xff0c;例如 /home/username/start_vllm.sh&#xff08;请替换 username 为…

AI绘画软件Stable Diffusion详解教程(3):Windows系统本地化部署操作方法(通用版)

上一篇教程介绍了如何在本地部署Stable Diffusion专业版&#xff0c;虽然便于技术人员研究&#xff0c;但是普通人使用起来不便捷&#xff0c;每次只能通过cmd窗口的指令形式或者python代码方式来画图&#xff0c;要记很多的指令很繁琐。 本篇教程教您搭建webui版的&#xff0…

大数据SQL调优专题——调优切入

引入 我们都知道大数据的SQL优化&#xff0c;并非一蹴而就的简单任务&#xff0c;而是一个涉及多个环节的复杂过程。虽然我们的专栏名字叫大数据SQL调优&#xff0c;但是调优并不是简单对SQL优化&#xff0c;而是一个涉及多个环节的复杂过程。实际上从需求接入到最终交付&…