Redis持久化(RDB、AOF)详解

news2024/7/4 4:58:26

Redis持久化详解

在这里插入图片描述

一、Redis为什么需要持久化?

  • Redis 是一个基于内存的数据库,拥有极高的读写性能,但是内存中的数据在断电或服务器重启时会全部丢失,因此需要一种持久化机制来将数据保存到硬盘上,以便在需要时进行恢复。
    在这里插入图片描述
  • Redis需要持久化主要是为了确保数据在服务器重启或发生故障时不会丢失。
    在这里插入图片描述

二、Redis持久化方式

Redis 支持两种主要的持久化方式:RDB(Redis Database Backup)和AOF(Append-Only File)。

1. RDB(Redis Database Backup)

RDB 是 Redis 的默认持久化方式,它通过定期将内存中的数据快照(snapshotting)写入磁盘来实现持久化。

在这里插入图片描述

当启用 RDB 持久化时,Redis 会根据配置文件中的 save 指令,周期性地将内存中的数据集转化成二进制文件(快照文件)保存到磁盘上。

RDB 的优势:

  • 1.高效:RDB最大化了Redis的性能,因为Redis父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘IO这样的操作。

  • 2.紧凑:RDB 文件是 Redis 数据在某个时间点的快照,以二进制格式存储,适合用于备份和恢复。

配置 RDB 持久化:

在 Redis 的配置文件中,可以通过以下配置来调整 RDB 持久化的行为:

在这里插入图片描述

  • save 指令的参数依次为持久化操作触发的时间和改变的 key 的数量。

在这里插入图片描述

save 900 1         # 在 900 秒(15 分钟)内,如果至少有 1 个 key 被改变,则执行持久化操作
save 300 10        # 在 300 秒内,如果至少有 10 个 key 被改变,则执行持久化操作
save 60 10000      # 在 60 秒内,如果至少有 10000 个 key 被改变,则执行持久化操作

默认情况下,Redis保存数据集快照到磁盘,名为dump.rdb的二进制文件。

在这里插入图片描述
RDB 快照文件较小,是一个紧凑的二进制文件,所以重启时加载速度很快。适合快速加载和传输。
在这里插入图片描述

配置示例

常见的 redis.conf 配置片段,涵盖了 RDB 快照的自动触发设置:

# 自动触发配置
save 900 1       # 900秒内至少1次写操作
save 300 10      # 300秒内至少10次写操作
save 60 10000    # 60秒内至少10000次写操作

# RDB 文件名
dbfilename dump.rdb

# RDB 文件保存路径
dir /var/lib/redis

# 是否压缩 RDB 文件
rdbcompression yes

# 是否校验 RDB 文件
rdbchecksum yes

RDB 触发机制:

1. 手动触发

Redis 提供了两个命令用于手动生成 RDB 快照:
在这里插入图片描述

  • SAVESAVE 命令会立即生成一个 RDB 文件,并阻塞 Redis 服务器直到保存操作完成。

  • 在执行 SAVE 的过程中,Redis 不能处理其他命令,因此在生产环境中通常不建议使用。

    SAVE
    

在这里插入图片描述

  • BGSAVEBGSAVE 命令会触发一个后台保存操作。

  • Redis 会创建一个子进程来进行 RDB 文件的生成,而父进程继续处理客户端请求。生成 RDB 文件完成后,子进程会退出。

    BGSAVE
    

在这里插入图片描述

2. 自动触发(基于配置)

Redis 根据配置文件中的设置,自动触发 RDB 快照保存。

这个机制基于配置文件 redis.conf 中的 save 参数,该参数定义了在一定时间内发生一定数量的写操作后触发 RDB 快照。

save 900 1  # 900秒内至少有1次写操作
save 300 10 # 300秒内至少有10次写操作
save 60 10000 # 60秒内至少有10000次写操作
  • 在900秒(15分钟)内,如果至少有一次写操作,Redis 将触发一次 RDB 保存。
  • 在300秒(5分钟)内,如果至少有10次写操作,Redis 将触发一次 RDB 保存。
  • 在60秒内,如果至少有10000次写操作,Redis 将触发一次 RDB 保存。

这些规则是按顺序检查的,一旦满足任一规则,Redis 就会触发一次 RDB 快照保存。

3. 特殊事件触发

除了手动和自动触发,某些特殊事件也会触发 RDB 快照保存:

  • 主从复制(Replication):当一个 Redis 实例作为主节点接受一个从节点的连接请求时,主节点会执行一次 BGSAVE 并将生成的 RDB 文件发送给从节点,这样从节点可以快速同步数据。

  • 故障恢复:如果 Redis 被配置为在启动时加载 RDB 文件,那么每次 Redis 重启时都会通过加载 RDB 文件来恢复数据。


Redis 快照(RDB)持久化的工作流程

  1. 调用 fork()

    • Redis 会调用 fork() 函数来创建一个子进程。

    • 此时,父进程和子进程会共享相同的内存空间,但由于操作系统的写时复制(Copy-On-Write, COW)机制,只有在父进程或子进程对数据进行写操作时,才会真正复制这些内存页面。
      在这里插入图片描述

    • 写时复制(Copy-On-Write, COW)是操作系统的一种优化技术。在 fork() 之后,父进程和子进程共享相同的物理内存页面,只有当其中一个进程需要写入数据时,才会为该进程创建新的内存页面。这带来了几个优势:

    • 效率高:通过共享内存,避免了不必要的内存复制,提高了效率。

    • 资源节约:只有在需要修改时才分配新的内存页面,节省了内存资源。

  2. 子进程写入 RDB 文件

    • 子进程负责将当前的数据集(即内存中的所有数据)写入到一个临时的 RDB 文件中。
    • 这个过程不会影响父进程的正常读写操作,因为它们在内存上是独立的。
  3. 替换旧的 RDB 文件

    • 当子进程完成对临时 RDB 文件的写入后,Redis 会用这个新的 RDB 文件替换原来的 RDB 文件。
    • 这是一个原子操作,可以确保在整个替换过程中,如果发生任何错误,旧的 RDB 文件仍然存在,不会造成数据丢失。
  4. 删除旧的 RDB 文件

    • 替换完成后,旧的 RDB 文件将被删除,以确保磁盘空间的合理使用。

RDB不足之处:

1.数据丢失风险:

  • RDB 持久化是通过周期性地生成数据快照来保存数据的。

  • 所以在两次快照之间发生的写操作如果宕机,会导致这些操作的数据丢失。

  • 例如,如果 Redis 在最后一次持久化后发生了故障,但是在下次持久化之前未能恢复,那么这期间的数据更新会丢失。

在这里插入图片描述

2.性能影响:

  • 在进行 RDB 持久化时,Redis 会 fork() 出一个子进程来执行持久化操作。
  • 如果数据集非常大,fork() 操作可能会消耗大量的 CPU 和内存资源,影响 Redis 的性能表现,特别是在持久化大数据集时会更加明显。

为了弥补这些不足,Redis 还提供了另一种持久化机制 AOF(Append-Only File),它通过记录每一次写操作来保证更高的持久化频率和数据安全性。


2. AOF(Append-Only File)

AOF 通过将每一个写操作(如 SET、INCR 等)追加到日志文件中,从而记录下所有对数据库状态改变的操作。

即使在 Redis 崩溃或重启后,可以通过重放这些操作来恢复数据。

在这里插入图片描述

当服务器重启时,会重新执行这些命令来恢复原始数据集的状态。

2. AOF 的工作流程

2.1 写命令的记录

每当 Redis 接收到一个会修改数据的命令时(如 SET、INCR 等),该命令会被以文本形式追加到 AOF 文件的末尾。

当然这些命令肯定不会执行一条就写入到文件中一条,这样会严重拖垮性能,而是先保存到临时缓冲区aof-buf中,再择机写入文件。

在这里插入图片描述

这些命令按照它们执行的顺序被记录下来。

2.2 同步策略

Redis 提供了几种不同的 AOF 同步策略,可以通过配置 appendfsync 参数来控制aof_buf缓冲区什么时候写入到AOF文件:
在这里插入图片描述

在这里插入图片描述

  • appendfsync always:每次有新命令追加到 AOF 文件时,都会立即调用 fsync() 将数据同步到磁盘。这种方式保证了最高的数据安全性,但性能较低。
  • appendfsync everysec:每秒钟调用一次 fsync()。这是默认配置,它在数据安全性和性能之间取得了良好的平衡。
  • appendfsync no:从不调用 fsync(),只依赖操作系统来决定何时将数据刷新到磁盘。这种方式性能最好,但数据安全性最低,如果系统崩溃,可能会丢失最近的写操作。
2.3 AOF 重写

随着时间的推移,AOF 文件会变得越来越大。为了避免文件过大影响性能,Redis 提供了 AOF 重写机制。

重写不是简单地压缩 AOF 文件,而是重新构建一个新的 AOF 文件,包含产生当前数据集的最简化命令集。

重写过程:
  1. 创建子进程:Redis 创建一个子进程来进行重写。这与 RDB 快照类似,使用 fork() 创建子进程。

  2. 子进程重写 AOF 文件:子进程会读取父进程的内存数据,并生成相应的最小集命令写入新的 AOF 文件。

  • 这个最小集合命令指的是在重写过程中,Redis 会尽可能地合并和优化原始 AOF 文件中的写操作,以便生成一个更加紧凑和高效的新 AOF 文件。
      1. 命令合并:Redis 子进程会读取当前内存中的数据集,并将多个连续的写命令合并为单个命令。例如,多个连续的 SET 命令可以被合并为一个 MSET 命令。
      1. 删除和更新优化:子进程会检查并丢弃那些已经被覆盖或者已经不存在的命令,从而减少新 AOF 文件中不必要的写入。
      1. 数据结构优化:Redis 会尝试将多个操作合并到一起,以减少写入的次数。例如,将多个操作整合成一个复合操作,比如一个事务或者一个批量操作。
      1. 命令合并和命令过滤:Redis 会分析命令之间的依赖关系,尽量合并多个操作为一个,同时过滤掉对最终数据集无效的命令。
        在这里插入图片描述
  1. 继续接收写操作:在重写过程中,父进程继续接收客户端的写操作,并将这些操作同时记录在旧的 AOF 文件和一个临时缓冲区aof_rewrite_buf中。

  1. 合并临时缓冲区:当子进程完成重写后,父进程将aof_rewrite_buf缓冲区中的命令追加到新的 AOF 文件末尾,确保所有写操作不丢失。

  2. 替换旧的 AOF 文件:最后,新的 AOF 文件会替换旧的 AOF 文件。

3. AOF 的优点和缺点

优点:
  • 数据安全性高:由于记录的是每个写操作,数据的持久化频率较高,可以最大程度地减少数据丢失。
  • 可读性好:AOF 文件是文本格式的日志文件,直接打开即可阅读和理解,适合用于数据恢复和分析。
  • 灵活性强:通过配置 appendfsync 参数,可以在性能和数据安全性之间进行灵活调整。
缺点:
  • 文件体积大:相比于 RDB 快照,AOF 文件会更大,因为它记录了所有的写操作。
  • 恢复速度慢:因为需要重放所有的写操作,恢复数据时会比加载 RDB 文件慢。
  • 性能开销:频繁的 I/O 操作可能会影响 Redis 的性能,尤其是在 appendfsync always 模式下。

4. 配置AOF持久化:

通过编辑 Redis 的配置文件 redis.conf 来启用和配置 AOF。

启用 AOF

appendonly 设置为 yes 以启用 AOF:

appendonly yes

在这里插入图片描述

AOF 文件名

指定 AOF 文件的名称,默认是 appendonly.aof

appendfilename "appendonly.aof"

AOF 重写策略

设置 AOF 重写的触发条件。Redis 提供了两种主要的重写触发策略:

  • 基于文件大小增长:当 AOF 文件自上次重写以来增长超过一定比例时触发重写。
    # 当 AOF 文件大小是上次重写后的两倍时触发重写
    auto-aof-rewrite-percentage 100
    
    # AOF 文件至少要达到此大小(以字节为单位)才会触发重写
    auto-aof-rewrite-min-size 64mb
    

在这里插入图片描述

AOF 同步策略

AOF 文件的同步策略决定了缓冲区数据何时被写入磁盘,这是性能和数据安全之间的权衡:
在这里插入图片描述

  • always:每个写操作都会同步到磁盘,非常安全但性能较差。
  • everysec:每秒同步一次,是常见的折中方案。
  • no:让操作系统决定何时将数据同步到磁盘,性能最好但有风险。
    在这里插入图片描述

AOF 重写时的阻塞策略

在 AOF 重写过程中,可以配置 Redis 是否允许阻塞写操作:

no-appendfsync-on-rewrite no

在这里插入图片描述

设置为 yes 时,在重写过程中不会执行 fsync 操作,以减少阻塞,但可能会丢失部分写操作。

2. 使用 Redis 命令动态配置 AOF

在 Redis 服务器运行时,可以使用 Redis 命令来动态配置 AOF 设置。
在这里插入图片描述

启用 AOF
CONFIG SET appendonly yes
调整 AOF 同步策略
CONFIG SET appendfsync everysec
手动触发 AOF 重写

你可以手动触发 AOF 重写,这对于某些维护操作是有用的:

BGREWRITEAOF

示例

# 启用 AOF
appendonly yes

# AOF 文件名
appendfilename "appendonly.aof"

# AOF 文件同步策略
appendfsync everysec

# 在重写期间是否禁止 fsync
no-appendfsync-on-rewrite no

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

三、RDB和AOF如何抉择?

1.RDB方案

性能和快速恢复需求:

  • 如果更关注于性能和快速启动恢复,且可以接受定期备份的数据丢失,那么可以选择 RDB。RDB 生成的备份文件小且加载速度快,适合定期备份和存档。

2.AOF方案

数据安全需求:

  • 如果数据的完整性和实时恢复能力是首要考虑因素,则应优先选择 AOF。AOF 可以在每次写操作后将数据同步到磁盘,提供更高的数据安全性。

3.混合持久化方案

在实际部署中,可以同时启用 AOF 和 RDB。AOF 提供实时数据保护和灾难恢复能力,而 RDB 用于定期备份和快速的全量恢复。这既保证了数据的安全性,又兼顾了性能和存储成本的平衡。

  • AOF 提供实时保护:AOF 记录每个写操作的日志,通过配置合适的 appendfsync 参数,可以保证数据在发生故障时的最小数据丢失。因此,将 AOF 设置为始终同步(always)或每秒同步(everysec)能够提供较高的数据安全性。

  • RDB 提供快速恢复:虽然 RDB 是周期性的全量备份,但它生成的备份文件较小且加载速度快,适合用于定期的数据恢复,尤其是在需要快速启动和大规模数据集的场景下。

  • AOF 文件大小管理:AOF 文件随着时间的推移可能会增长,影响存储和性能。定期进行 AOF 的压缩和重写(通过 AOF RewriteAOF compaction)可以控制文件大小,减少不必要的存储和传输成本。

  • RDB 备份策略:通过配置合适的 RDB 备份频率(如每隔几小时或每天一次),可以在需要时恢复整个数据库状态,而不会因为频繁备份而增加系统负担。


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

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

相关文章

R语言数据分析案例34-基于ARIMA模型的武汉市房价趋势与预测研究

一、背景阐述 房地产行业对于国民经济和社会及居民的发展和生活具有很大的影响,而房价能够体现经济运转的好坏,因而房价的波动牵动着开发商和购房者的关注,城市房价预测是一个研究的热点问题,研究房价对民生问题具有重要意义。 …

【面试干货】Java中的++操作符与线程安全性

【面试干货】Java中的操作符与线程安全性 1、什么是线程安全性?2、 操作符的工作原理3、 操作符与线程安全性4、如何确保线程安全?5、 结论 💖The Begin💖点点关注,收藏不迷路💖 在Java编程中,操…

思维导图MindManager2024最新版,让你的思维飞起来!

亲爱的朋友们,今天我要跟大家分享一款我近期深度使用并彻底被种草的神器——MindManager2024最新版本的思维导图软件。作为一位对效率和创意有着极高追求的内容创作者,我几乎尝试过市面上所有的思维导图工具,而MindManager2024无疑是其中的佼…

跟着DW学习大语言模型-什么是知识库,如何构建知识库

建立一个高效的知识库对于个人和组织来说非常重要。无论是为了个人学习和成长,还是为了组织的持续创新和发展,一个完善的知识管理系统都是不可或缺的。那么,如何建立一个高效的知识库呢? 在建立知识库之前,首先需要确定…

【办公类-51-01】月评估数字生成01-平均数空值

期末需要制作月评估,每月给孩子的能力水平打分。 以前我是做在EXCEL里,手动打分,然后用公式计算1、2、3出现的个数,然后计算平均数,最后复制到Word里。 因为是手动计算,每次都要算很长时间,确保…

借助TheGraph 查询ENS信息

关于ENS (以太坊域名服务) ENS 全称是 Ethereum Name Service,它是一个建立在以太坊区块链上的去中心化域名系统。 ENS 在 Web3 领域发挥着重要作用,主要有以下几个方面: 可读性更好的地址: ENS 允许用户将复杂的以太坊地址(如 0x12345…) 映射为更简单易记的域名。这极大地提…

KUBIKOS - Animated Cube Mini BIRDS(卡通立方体鸟类)

软件包中添加了对通用渲染管线 (URP) 的支持! KUBIKOS - 动画立方体迷你鸟是17种不同的可爱低多边形移动友好鸟的集合!每只都有自己的动画集。 完美收藏你的游戏! +17种不同的动物! + 低多边形(400~900个三角形) + 操纵和动画! + 4096x4096 纹理图集 + Mecanim 准备就绪…

生命在于学习——Python人工智能原理(4.3)

三、Python的数据类型 3.1 python的基本数据类型 3.1.4 布尔值(bool) 在Python中,布尔值是表示真或假的数据类型,有两个取值,True和False,布尔值常用于控制流程、条件判断和逻辑运算,本质上来…

项目实训-接口测试(十八)

项目实训-后端接口测试(十八) 文章目录 项目实训-后端接口测试(十八)1.概述2.测试对象3.测试一4.测试二 1.概述 本篇博客将记录我在后端接口测试中的工作。 2.测试对象 3.测试一 这段代码是一个单元测试方法,用于验证…

idea 开发工具properties文件中的中文不显示

用idea打开一个项目,配置文件propertise中的中文都不展示,如图: 可修改idea配置让中文显示: 勾选箭头指向的框即可,点击应用保存,重新打开配置文件,显示正常

篮球联盟管理系统

管理员账户功能包括:系统首页,个人中心,管理员管理,球员管理,用户管理,球队管理,论坛管理,篮球资讯管理,基础数据管理 前台账户功能包括:系统首页&#xff0…

Cell2Sentence:为LLM传输生物语言

像GPT这样的LLM在自然语言任务上表现出了令人印象深刻的性能。这里介绍一种新的方法,通过将基因表达数据表示为文本,让这些预训练的模型直接适应生物背景,特别是单细胞转录组学。具体来说,Cell2Sentence将每个细胞的基因表达谱转换…

前端架构(含演进历程、设计内容、AI辅助设计、架构演进历程)

前端架构的演进历程 前端架构师的必要条件 全面的技术底蕴全局观(近期 远期)业务要有非常深刻的理解沟通协调能力和团队意识深刻理解前端架构的原则和模式 前端架构的设计内容 技术选型(库、工具、标准规范、性能、安全、扩展性 )设计模式及代码组织(模…

ADS SIPro使用技巧之RapidScan-Z0

PCB走线的阻抗对每个网络的信号完整性至关重要,但是,验证每个信号是不切实际的,尤其对于设计复杂度很高的产品而言,设计者的有限精力只能用于关注关键的设计点,这一过程往往会造成一些设计的疏忽从而导致错误。 ADS SI…

97. 交错字符串(leetcode)

97. 交错字符串(leetcode) 题目描述 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: s s1 …

图书管理系统(详解版 附源码)

目录 项目分析 实现页面 功能描述 页面预览 准备工作 数据准备 创建数据库 用户表 创建项目 导入前端页面 测试前端页面 后端代码实现 项目公共模块 实体类 公共层 统一结果返回 统一异常处理 业务实现 持久层 用户登录 用户注册 密码加密验证 添加图书…

串口小工具(来源网络,源码修改)

从CSDN 中的一位博主的分享做了一些修改 QtSerial 的配和更稳定些 信号和槽 … … 更不容易崩 # This Python file uses the following encoding: utf-8 import sys import timefrom PySide6.QtGui import QIcon, QTextCursor from PySide6.QtWidgets import QApplication, QWi…

【PyQt5】一文向您详细介绍 layout.addWidget() 的作用

【PyQt5】一文向您详细介绍 layout.addWidget() 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本…

el-dialog el-select适配移动端

一、el-dialog 2024.06.20今天我学习了如何对el-dialog弹窗适配移动端展示,效果如下: 代码如下: media screen and (min-width: 220px) and (max-width: 600px) {::v-deep .el-dialog {width: 95% !important;} } 二、el-select 代码如下…

技术革命背后的新功能发布:探索Facebook创新

随着技术的飞速发展和社交媒体的普及,Facebook作为全球最大的社交平台之一,不断推出新的功能和服务,以满足用户的需求和提升用户体验。这些新功能不仅仅是技术进步的体现,更是Facebook在竞争激烈的数字化时代中保持领先地位的关键…