• 详细介绍Redis RDB和AOF两种持久化方式


    RDB持久化

    RDB是Redis的一种快照持久化方式,它将内存中的数据集都写入磁盘,生成一个RDB文件,RDB文件是一个经过压缩的二进制文件(通常叫做数据快照),可以用于备份、迁移和恢复数据。

    RDB的优点是快速、紧凑,适合备份和恢复大量数据,但是它的缺点是数据可能会丢失,因为RDB文件只保存了最后一次快照的数据

    执行时机

    RDB持久化在以下四种情况下会执行:

    1. 执行save命令(Redis持久化命令):

    当执行save命令时,Redis会阻塞所有客户端请求,将内存中的数据集快照写入磁盘,生成一个RDB文件。这个过程会阻塞Redis的正常运行(无法响应客户端请求,造成服务中断),保存完成后,Redis会解除阻塞,继续处理客户端请求。

    2. 执行bgsave命令(后台持久化命令):

    bgsave命令的执行过程中,Redis会先创建一个子进程,然后父进程继续处理客户端请求,而子进程负责将数据集保存到磁盘。这种方式可以保证Redis的正常响应,不会中断服务。 由于bgsave命令是在后台执行的,所以在执行期间无法立即得知保存的进度和结果,可以通过lastsave命令或者检测RDB文件判断保存情况。

    3. Redis停机

    当Redis服务停机时,无论是正常关闭还是异常退出,都会触发RDB持久化,Redis会执行一次save命令,将数据集快照写入磁盘。

    4. 触发RDB条件

    用户可以通过设置配置文件(redis.conf)中的save命令来指定触发RDB持久化的条件,

    例如:设定在900秒内至少有1个键被修改,就执行一次bgsave命令(如果是save "" 则表示禁用RDB)

    # redis.conf文件

    save 900 1 

    执行原理

    bgsave开始时会fork主进程得到子进程(和主进程相同),子进程共享主进程的内存数据,负责将内存中的数据集写入磁盘。

    fork命令使用了写时复制(Copy-on-Write)的技术:在主进程执行写操作时,才会真正复制父进程的内存页,而在此之前,子进程与父进程共享相同的内存页,这样可以减少内存的复制开销,提高性能。

    AOF持久化

    在Redis每次写入操作执行完成后,将该操作以文本的形式追加到AOF文件的末尾,AOF文件是一个文本文件,记录了所有写入操作的历史(也就是记录写操作的命令),可以用于数据恢复。

    AOF的执行时机是由Redis自动触发的,由刷盘策略决定。

    开启AOF方式方法,修改配置文件redis.conf(不需要关闭RDB,二者可以同时使用)

    # redis.conf文件

    # 是否开启AOF功能,默认是no
    appendonly yes
    # AOF文件的名称
    appendfilename "appendonly.aof"

    AOF 3种刷盘策略

    刷盘策略刷盘时机优点缺点
    always每次写入操作数据安全性最高,几乎不会丢数据性能开销较大
    everysec每秒刷盘数据安全较高,性能相对较好性能适中
    no操作系统决定刷盘时机性能开销最小数据安全性较低

    文件配置

    # redis.conf文件(三个选一个)
    appendfsync always 
    # appendfsync everysec 
    # appendfsync no

    二者对比

    - RDB是快照形式的持久化方式,将数据集的快照以二进制形式保存在磁盘上,而AOF是将写入操作以追加的方式记录到文件中。

    - RDB持久化生成的文件较小,加载速度较快。AOF持久化生成的文件较大,加载速度较慢,但可以提供更好的数据安全性。

    - RDB持久化可以定期或手动触发,而AOF持久化可以根据不同的刷盘策略进行配置

    - RDB持久化对Redis的读取性能没有影响,因为数据是从磁盘加载到内存中,而AOF持久化在写入性能上可能会有一定影响,因为每次写入操作都需要追加到文件中。

    - RDB持久化在故障恢复时速度较快,因为只需加载最近的RDB文件即可,而AOF持久化在故障恢复时可能需要较长时间,因为需要重新执行AOF文件中的所有写入操作。

    总结:RDB适合备份和恢复大量数据,加载速度快;AOF提供更好的数据安全性,但文件较大且加载速度较慢。

  • 相关阅读:
    字节外包凭借【ui自动化测试框架】成功进入内部编制
    Spring-AOP总结
    【读书笔记】《0day安全》第二章:栈溢出的原理和实践
    Databend 集群部署 | 新手篇(2)
    ROS自学笔记十四:URDF语法详解
    基于Kubernetes v1.24.0的集群搭建(三)
    吴恩达机器学习复习1:监督学习、无监督学习、模型表示、损失函数、直觉Ⅰ、直觉Ⅱ、梯度下降及其直觉、线性回归的梯度下降
    【Python基础入门7】程序的组织结构、range函数及pass语句
    数据结构与算法复习:第三十二弹
    Golang Linux 安装与环境变量配置
  • 原文地址:https://blog.csdn.net/DU9999999/article/details/133444030