Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?

简介: Redis 是一个内存数据库,意味着它主要将数据存储在内存中,从而能够提供极高的性能。然而,作为内存数据库,Redis 默认情况下的数据不会永久保存。为了确保数据在重启或故障后能够恢复,Redis 提供了几种 **持久化机制**。这些机制允许 Redis 将内存中的数据保存到硬盘上,从而实现数据持久化。

一、关于Redis 持久化

1.1 简介

Redis 是一个内存数据库,意味着它主要将数据存储在内存中,从而能够提供极高的性能。然而,作为内存数据库,Redis 默认情况下的数据不会永久保存。为了确保数据在重启或故障后能够恢复,Redis 提供了几种 持久化机制。这些机制允许 Redis 将内存中的数据保存到硬盘上,从而实现数据持久化。

Redis 提供了两种主要的持久化方式:RDB(Redis 数据库快照)AOF(Append-Only File)日志。除此之外,Redis 还提供了 混合持久化 机制,结合了 RDB 和 AOF 的优点。

cf4f49ea-e531-4e07-bbce-b394c19ea1a4

1.2 发展

Redis 的持久化机制经历了多个版本的改进与演化,随着需求的变化,Redis 提供了不同的持久化方案来满足各种应用场景。以下是 Redis 持久化发展历程的简要概述:

  1. 早期(Redis 1.x)
  • 在 Redis 1.x 版本,持久化机制的设计就已经开始出现,并且初步支持了 RDB(Redis 数据库快照) 机制。此时,RDB 是 Redis 唯一的持久化方式。
  • RDB(快照) :每隔一段时间,Redis 会将内存中的数据写入到磁盘生成一个二进制文件(dump.rdb​),通过这种方式来保证数据在重启后能够恢复。
  • 该版本的持久化机制设计较为简单,主要是为了提供对数据丢失的容忍以及重启后的数据恢复能力。
  1. Redis 2.0 - 引入 AOF(追加文件)
  • AOF(Append-Only File) :在 Redis 2.0 版本中,新增了 AOF 持久化,这为 Redis 提供了另一种持久化策略。与 RDB 快照不同,AOF 会记录 Redis 执行的所有写操作,并将这些操作以日志的形式追加到文件中(appendonly.aof​)。在 Redis 重启时,可以通过重放 AOF 文件中的命令恢复数据。

    • AOF 提供了比 RDB 更高的数据安全性,因为它记录了每个操作,理论上可以做到几乎没有数据丢失。
    • 但是,由于每个写操作都需要同步到磁盘,AOF 的性能开销相对较大,尤其是在高频率写入的情况下。
  1. Redis 2.4 - AOF 重写机制
  • Redis 2.4 版本中,为了减少 AOF 文件随着时间推移而变得越来越大的问题,引入了 AOF 重写机制(AOF Rewrite)
  • AOF 重写机制通过创建一个新的 AOF 文件,重写当前数据库状态下的最小化写操作,将文件缩减到一个更小的大小。这一机制使得 AOF 文件不会无限增长,有助于节省磁盘空间。
  • 通过定期重写 AOF 文件,Redis 在性能和磁盘空间使用之间找到了一个较好的平衡。
  1. Redis 3.0 - 引入 RDB 和 AOF 混合持久化
  • Redis 3.0 在原有的 RDB 和 AOF 两种持久化机制基础上,提出了 RDB + AOF 混合持久化 方案。

    • 混合持久化模式将 RDB 和 AOF 的优点结合起来:在 Redis 重启时,首先使用 RDB 文件进行快速恢复,然后再用 AOF 文件来完成更高精度的恢复。这样可以在启动时获得更好的性能,同时减少 AOF 文件的恢复时间。
    • 混合持久化机制通过将 AOF 写操作存储在 RDB 快照文件之后,减少了 AOF 文件的大小,并提高了数据恢复的速度。
  1. Redis 4.0 - AOF 重写性能优化
  • Redis 4.0 版本中,AOF 重写机制进行了进一步的优化,尤其是在内存消耗和文件重写的效率上做了改进。
  • Redis 4.0 引入了 AOF 持久化重写时的后台线程,即 AOF 重写不再阻塞主线程,而是通过一个后台线程异步地进行,从而避免了 AOF 重写过程中的性能瓶颈。
  • 此外,Redis 4.0 增强了对 AOF 文件在大规模数据时的处理能力,使得 AOF 持久化更加高效。
  1. Redis 5.0 - AOF 日志的优化和压缩
  • Redis 5.0 进一步对 AOF 持久化机制进行了优化,增强了 AOF 文件的压缩和优化。通过对 AOF 文件中的重复操作进行压缩,减少了磁盘的使用空间,提升了 AOF 机制的性能。
  • Redis 5.0 中还对持久化的配置进行了一些细化,比如优化了 AOF 文件的重写触发机制,避免了重写过程中因不必要的操作而造成性能的影响。
  1. Redis 6.0 - 持久化机制的改进和安全性增强
  • Redis 6.0 版本对持久化机制做了些许优化,尤其是对 AOF 和 RDB 文件在高负载下的表现进行了改进,提升了 Redis 在大规模部署时的稳定性。
  • 此版本还引入了更多的安全性特性,比如 更强的加密 支持和对客户端连接的限制,虽然这些主要是针对安全性,但间接地影响了 Redis 的持久化性能。
  • 同时,Redis 6.0 提供了更多灵活的配置选项,允许更精细地控制持久化机制的行为,以适应不同的生产环境需求。
  1. Redis 7.0 - 更进一步的持久化优化
  • Redis 7.0 引入了 更智能的 AOF 重写机制,进一步优化了 Redis 启动和恢复的速度。
  • 在 Redis 7 中,持久化机制更加灵活,通过配置 appendfsync​(AOF 文件同步策略)和 save​(RDB 快照保存策略),用户可以精确控制持久化行为,从而在性能和数据一致性之间找到平衡。
  • Redis 7.0 对 RDB 文件和 AOF 文件的合并操作进行了改进,以便在某些情况下减少系统资源的消耗,并提高数据恢复效率。

二、RDB 持久化(快照)

2.1 简介

RDB(Redis Database)持久化通过 定期创建数据快照 来保存数据。RDB 会将 Redis 内存中的数据保存到一个二进制文件(默认为 dump.rdb​)中。

Redis 默认启用了 RDB 快照 持久化,而 AOF 持久化 默认是关闭的

image

2.2 工作原理

  • Redis 会在特定的时间间隔内,自动将内存中的数据快照保存到磁盘上(即 RDB 文件)。
  • RDB 是一种 时间点快照,这意味着 Redis 会在某个时间点将内存中的数据全部写入文件。如果在快照期间发生了数据变化,那么这些变化将不会出现在该快照中。

image

  • 当 Redis 执行 BGSAVE​ 命令或者根据 save​ 配置自动执行时,它会通过 fork()​ 系统调用创建一个子进程,子进程会将当前内存中的所有数据(整个数据库的内容)写入一个临时的 RDB 文件。
  • 快照的写入是一次性操作,不会中途停止,也没有增量更新。
  • 快照完成后,新的 RDB 文件会替换原先的文件(通常是 dump.rdb​)。

2.3 配置方法

  • 可以通过 redis.conf​ 文件中的配置来设置 RDB 快照的生成条件。例如,设置在特定时间内执行多少次写操作后进行快照:

    save 900 1   # 900秒内如果至少发生1次写操作,则生成快照
    save 300 10  # 300秒内如果至少发生10次写操作,则生成快照
    save 60 10000 # 60秒内如果至少发生10000次写操作,则生成快照
    

这些条件是 “或” 的关系,也就是说,只要 任意一个条件满足,Redis 就会执行快照操作。因此,只要有任意一组条件被触发,Redis 就会创建 RDB 快照文件。

windows redis版本,redis.windows.conf文件配置

image

image

2.4 优点

  • 性能高效:RDB 持久化是基于快照的方式,生成快照时对 Redis 的性能影响相对较小。
  • 恢复速度快:当 Redis 重启时,RDB 文件加载速度较快,可以迅速恢复数据。
  • 节省磁盘空间:由于是定期生成快照,因此 RDB 文件通常比 AOF 文件小。

2.5 缺点

  • 数据丢失风险:由于 RDB 是基于快照的,如果在快照生成和下一次快照之间发生故障,则该段时间内的数据将丢失。
  • 不够灵活:无法像 AOF 那样记录每一条命令,灵活性较差。

2.6 使用场景

  • 适用于对数据丢失要求不高的场景,或者数据本身容易重建的应用。
  • 在大多数情况下,RDB 适合用来进行数据备份。

三、AOF 持久化(Append-Only File)

3.1 简介

AOF(Append-Only File)是 Redis 的另一种持久化机制,它通过记录所有写操作的日志来确保数据持久性。每次对 Redis 执行写操作时,都会将该操作追加到 AOF 文件中。AOF 文件实际上是 Redis 执行命令的一个日志,重启 Redis 时,Redis 会重新执行这些命令来恢复数据。

文件名:appendonly.aof,如果没有更改过配置文件的 dir​ 配置,默认会在 Redis 的当前工作目录下生成 AOF 文件。

image

3.2 工作原理

  • Redis 将每一个写操作(如 SET​、INCR​ 等)追加到 AOF 文件中,AOF 文件会记录每个写命令。
  • 在 Redis 重启时,会重新执行 AOF 文件中的命令,恢复数据。

3.3 配置方法

  • 可以通过 redis.conf​ 文件中的 appendonly​ 配置项开启 AOF 持久化:

    appendonly yes
    appendfilename "appendonly.aof"
    
  • AOF 同步策略:Redis 提供了三种 AOF 同步策略,控制写命令同步到 AOF 文件的方式:

    • appendfsync always​:每个写命令都会同步到 AOF 文件(最安全,但性能最差)。
    • appendfsync everysec​:每秒同步一次(既保证了数据安全,又提供了较好的性能,推荐使用)。
    • appendfsync no​:Redis 依赖操作系统来同步 AOF 文件(性能最好,但数据安全性最差)。

image

3.4 优点

  • 数据安全性高:AOF 持久化记录了每个写命令,即使 Redis 崩溃,AOF 文件可以保证数据的恢复。
  • 精确恢复:由于记录的是每个写命令,AOF 可以恢复到非常接近崩溃时的状态。

3.5 缺点

  • 性能开销较大:每次写命令都需要记录到 AOF 文件,频繁的磁盘写入会影响性能。
  • AOF 文件可能较大:由于记录了每一条写操作,AOF 文件通常比 RDB 文件大,特别是在写操作频繁的情况下。

3.6 使用场景

  • 适用于对数据安全性要求较高的场景,如金融、交易系统等。

四、混合持久化(RDB + AOF)

4.1 简介

Redis 4.0 引入了 混合持久化(Hybrid Persistence)功能,将 RDB 和 AOF 结合起来,结合了两者的优点。混合持久化将 RDB 快照的内容和 AOF 操作日志结合保存。

image

备注:Redis Windows 版本(无论是官方的还是第三方移植的版本)并不支持混合持久化功能。(Redis 最初是为了 Linux/Unix 系统设计的,因此官方并未提供直接支持 Windows 的原生版本。Windows 上的 Redis 实际上是通过 Microsoft 的开源项目 MicrosoftArchive/redis 来移植的,或者有社区的其他移植版本。)

4.2 工作原理

  • 在混合持久化模式下,Redis 会在生成 RDB 快照时,将 RDB 快照头和 AOF 日志结合成一个新的 AOF 文件。这样既保证了数据在恢复时的精确性,又降低了 AOF 文件的大小。

4.3 优点

  • 恢复速度快:因为它结合了 RDB 的快速恢复能力和 AOF 的精确恢复能力。
  • 节省磁盘空间:相比纯 AOF,混合持久化生成的文件更小。
  • 高性能:相对于纯 AOF 持久化,混合持久化对性能的影响较小。

4.4 配置方法

要启用混合持久化,您需要在 redis.conf​ 配置文件中做如下设置:

  1. 启用 AOF 持久化: 确保 appendonly​ 配置项设置为 yes​,表示启用 AOF 持久化。

    appendonly yes
    
  2. 启用混合持久化: 在 Redis 4.0 及以上版本,混合持久化是默认启用的,但您可以通过设置以下选项来进行配置:

    aof-use-rdb-preamble yes
    

    这个配置项的作用是启用 AOF 文件中的 RDB 前缀(即在 AOF 文件开头部分存储 RDB 快照)。如果设置为 no​,则 Redis 会使用传统的 AOF 文件格式,不会混合 RDB 快照。

  3. RDB 和 AOF 配置: 如果您已经启用了 AOF 持久化,您可以继续使用常规的 AOF 配置项来调整 AOF 文件的行为(如 appendfsync​ 和 auto-aof-rewrite​ 等)。

完整配置示例:

# 启用 AOF 持久化
appendonly yes

# 启用混合持久化
aof-use-rdb-preamble yes

# AOF 文件同步策略(根据需要选择)
appendfsync everysec

# AOF 文件的重写策略
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 定期创建 RDB 快照的配置(如果需要)
save 900 1   # 900秒(15分钟)内至少有1次写操作
save 300 10  # 300秒(5分钟)内至少有10次写操作
save 60 10000 # 60秒内至少有10000次写操作

4.5 使用场景

  1. 高频写入与持久化要求高的场景:混合持久化减少了 AOF 写入的性能瓶颈,同时保证数据持久化。
  2. 快速恢复场景:混合持久化利用 RDB 快速恢复数据,再通过 AOF 恢复增量更新,减少恢复时间。
  3. 磁盘 I/O 和内存占用平衡的场景:结合 RDB 的定期快照和 AOF 的增量更新,避免 AOF 文件过大,优化磁盘空间使用。
  4. 高可用性和数据安全性需求:通过结合 RDB 和 AOF,减少数据丢失的风险,并保证数据快速恢复。
  5. 低延迟要求的系统:混合持久化减少了 AOF 文件的写入,降低了磁盘延迟,适用于低延迟的应用场景。

五、持久化选择与配置

在实际应用中,如何选择持久化方式取决于对 性能数据安全性 的不同需求:

  • 如果 数据安全性要求较高,可以选择 AOF 持久化或混合持久化。
  • 如果 对性能要求较高,且可以容忍少量数据丢失(例如一分钟内的数据),则可以使用 RDB 持久化。
  • 对于一些 备份需求,可以使用 RDB 配合 AOF,获得两者的优势。

Redis 提供了两种主要的持久化机制:RDBAOF,每种机制有各自的优缺点。RDB 更注重性能,适合做定期备份,但可能会丢失最近的几分钟数据;AOF 更注重数据的完整性,适合对数据丢失敏感的应用,但会带来一定的性能开销。混合持久化结合了 RDB 和 AOF 的优势,可以提供更快的恢复速度和更小的文件大小。根据具体的业务需求,可以选择合适的持久化策略。

目录
相关文章
|
17小时前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
|
7天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
9天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
8569 20
|
13天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4586 11
资料合集|Flink Forward Asia 2024 上海站
|
13天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
21天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
9天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
9天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
747 45
|
6天前
|
弹性计算 运维 监控
阿里云云服务诊断工具:合作伙伴架构师的深度洞察与优化建议
作为阿里云的合作伙伴架构师,我深入体验了其云服务诊断工具,该工具通过实时监控与历史趋势分析,自动化检查并提供详细的诊断报告,极大提升了运维效率和系统稳定性,特别在处理ECS实例资源不可用等问题时表现突出。此外,它支持预防性维护,帮助识别潜在问题,减少业务中断。尽管如此,仍建议增强诊断效能、扩大云产品覆盖范围、提供自定义诊断选项、加强教育与培训资源、集成第三方工具,以进一步提升用户体验。
641 243
|
3天前
|
弹性计算 运维 监控
云服务测评 | 基于云服务诊断全方位监管云产品
本文介绍了阿里云的云服务诊断功能,包括健康状态和诊断两大核心功能。作者通过个人账号体验了该服务,指出其在监控云资源状态和快速排查异常方面的优势,同时也提出了一些改进建议,如增加告警配置入口和扩大诊断范围等。