欢迎光临
我们一直在努力

Redis持久化

Redis持久化

​Redis持久化的核心目标是确保数据安全,防止因进程意外退出而导致数据丢失。其基本思想是将数据同时保存在内存和硬盘中。

  • 写操作:数据同时写入内存和硬盘。
  • 读操作:直接读取内存中的数据,保证高性能。
  • 数据恢复:当Redis重启时,利用硬盘中保存的数据来恢复内存中的数据状态。
  • 代价:需要消耗额外的存储空间,因为同一份数据存储了两份。

Redis提供了两种主要的持久化机制:RDB(Redis Database) 和 AOF(Append Only File)。RDB可理解为定期备份,而AOF则是实时备份。

01.RDB

分为手动触发和自动触发。

1.1手动触发
1.1.1save命令

​阻塞式执行,直到RDB过程完成。对于大数据量实例会造成长时间阻塞,不推荐使用。

1.1.2bgsave命令

​后台异步执行。Redis主进程通过fork操作创建子进程,由子进程负责快照生成,主进程继续提供服务。阻塞仅发生在fork阶段,时间极短。

​bgsave工作流程

  • 检查:判断是否已有其他bgsave子进程正在运行,避免重复执行。
  • Fork:主进程fork出一个子进程。fork运用了操作系统的写时复制(Copy-On-Write) 技术,即使数据量大,在绝大部分数据不变的情况下,内存消耗也较小。
  • 生成快照:子进程将内存中的数据以RDB格式写入一个临时文件。
  • 替换文件:子进程完成写盘后,用临时文件原子性地替换旧的RDB文件(通常是dump.rdb),并通知主进程。
  • 清理:主进程更新统计信息,子进程结束。在这里插入图片描述
  • 1.2自动触发

    通过在配置文件(redis.conf)中设置规则,让Redis在满足条件时自动执行bgsave。例如,配置“N秒内数据集至少有M个改动”时触发。

    02.配置与文件
    • 配置文件:通常位于/etc/redis/redis.conf。可通过 config get dir查找该文件。

      • 在这里插入图片描述

      • dir /var/lib/redis:通过该命令+路径指定RDB文件(及AOF文件)的工作目录。

      • dbfilename dump.rdb:指定RDB文件名。

      • save <seconds> <changes>:配置自动触发条件,如save 60 10000。

      • save "":用于关闭RDB自动持久化。

    2.1RDB文件

    ​是一个压缩的二进制文件,不可直接编辑。Redis提供了redis-check-rdb工具(或redis-server –check-rdb)来校验其完整性。

    ​有可能你的安装路径与之不符,可以通过下面命令查找find /usr -name "redis-*" 2>/dev/null。后面的操作是让输出更简洁。

    在这里插入图片描述

    这样我们就可以发现-rdb结尾的文件了,即rdb校验工具。

    在这里插入图片描述

    • 当执行生成rdb镜像 操作的时候,

      1、会把要生成的快照数据,先保存至一个临时文件。当快照生成完毕

      2、再删除之前的rdb文件

      3、再把新生成的临时rdb文件改为刚刚的dump.rdb。

      这样就保证了dump.rdb文件自始至终就只有一个

    2.2RDB文件操作

    使用命令:

    • 连接到本地Redis服务器的6379端口

      redis-cli -h 127.0.0.1 -p 6379

    • 使用vi编辑器打开Redis的RDB数据文件(不建议使用vi直接查看或编辑dump.rdb文件)

      vi 你的路径/dump.rdb

    在这里插入图片描述

    然后在redis客户端插入数据,再次查看rdb文件,没有变化。也就是说现在并未执行手动触发rdb,也没有达到自动触发rdb的条件。

    因为自动触发RDB持久化的条件,可以在配置文件 /etc/redis/redis.conf 中通过 save 指令设置。

    在这里插入图片描述

    ​但是生成一次rdb快照的成本是一个比较高的成本,不能让这个操作太频繁。这也导致快照的数据和实时内存中的数据可能存在偏差。比如说在两次快照之间的时候,redis服务器挂了,就会导致在快照之间这个时间段的数据就丢失了,因为还并未写到磁盘。(AOF就是解决这种场景的有效方案)

    2.3触发rdb场景

    除了手动命令和配置触发,以下情况也会自动触发RDB生成:

    • 执行shutdown命令正常关闭Redis时。
    • 在主从复制场景中,主节点会自动生成RDB快照并发送给从节点。
    2.4RDB优缺点
    • 优点:
      • 文件紧凑,适合备份、全量复制和灾难恢复。
      • 数据恢复速度远快于AOF。
    • 缺点:
      • 无法做到实时/秒级持久化,两次快照之间的数据有丢失风险。
      • bgsave的fork操作属于重量级操作,频繁执行成本高。
      • 二进制格式可能存在不同版本的兼容性问题。

    02.AOF持久化(实时命令日志)

    AOF以独立日志的形式记录每次写命令,重启时重新执行这些命令来恢复数据,解决了数据持久化的实时性问题。

    2.1开启AOF

    在redis.conf中将appendonly配置项改为yes,并重启Redis生效。AOF文件默认保存在与RDB相同的工作目录下,文件名由appendfilename指定。

    2.2工作流程

    核心流程包括:命令追加、文件同步、文件重写、重启加载。

  • 命令写入:所有写命令在执行后都会追加到内存中的AOF缓冲区(aof_buf)。
  • 文件同步:根据配置的同步策略,将缓冲区内容写入并同步到AOF文件。
  • 文件重写:定期压缩AOF文件体积。
  • 重启加载:Redis启动时,优先加载AOF文件进行数据恢复。
  • 2.3 写入与同步策略(appendfsync)

    策略通过appendfsync参数控制,是性能与安全性的权衡关键。

    • always:每个写命令都同步写入硬盘(fsync)。数据最安全,但性能影响最大。
    • everysec(默认):先执行write写入系统缓冲区,再由后台线程每秒进行一次fsync同步。兼顾安全与性能,理论上最多丢失1秒数据。
    • no:只执行write,由操作系统决定何时同步。性能最好,但数据丢失风险最高。
    2.4 重写机制

    为了解决AOF文件不断增大的问题,Redis引入AOF重写来压缩文件体积。

    • 压缩原理:

      • 丢弃进程内已超时的数据。
      • 将多条命令合并为最终状态的一条命令。
      • 删除无效的命令。
    • 触发方式:

      • 手动触发:执行bgrewriteaof命令。
      • 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数自动判断。
    • 重写流程(bgrewriteaof):
      在这里插入图片描述

    • 主进程fork出子进程。
    • 子进程基于当前内存数据,生成新的AOF文件(此过程不依赖旧AOF文件)。
    • 主进程在此期间将新的写命令同时写入原有的AOF缓冲区和重写缓冲区(aof_rewrite_buf)。
    • 子进程完成新AOF文件写入后,通知主进程。
    • 主进程将重写缓冲区的内容追加到新的AOF文件中。
    • 用新的AOF文件原子替换旧文件。
    2.5混合持久化

    为了解决AOF文件恢复速度慢的问题,Redis 4.0引入了混合持久化。

    • 开启:通过配置aof-use-rdb-preamble yes(默认开启)。
    • 原理:在AOF重写时,子进程将当前内存数据以RDB二进制格式写入新的AOF文件头部。之后主进程的写命令再以AOF文本格式追加到文件尾部。这样既利用了RDB的快速恢复特性,又保留了AOF的实时性。
    • 文件内容:重写后的AOF文件是“RDB头部 + AOF尾部”的混合体。

    在这里插入图片描述

    总结:

    • 当AOF和RDB同时开启时,Redis重启会优先使用AOF文件进行数据恢复,因为AOF通常数据更全。
    • 数据恢复流程:Redis启动时,会检查是否启用了AOF。如果启用,则加载AOF文件(如果是混合格式,先加载RDB部分,再执行后续的AOF命令);如果未启用AOF,则尝试加载RDB文件。
    特性RDBAOF
    持久化方式 定时生成内存快照 记录每次写命令日志
    数据完整性 可能丢失两次快照间的数据 根据策略不同,完整性更高(如每秒同步)
    恢复速度 快(二进制,直接载入) 慢(需重放命令)
    文件大小 小(压缩二进制) 大(文本命令日志,可重写压缩)
    对性能影响 fork子进程时会有瞬时阻塞和内存消耗 主要在于文件同步策略的磁盘IO开销
    应用场景 冷备、全量复制、快速恢复 对数据安全性要求高、可容忍轻微性能损失的场景

    核心共同点:RDB和AOF都利用了fork子进程和操作系统的写时复制技术,尽可能减少对主进程处理请求的影响。

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » Redis持久化
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址