• Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)


    Redis的持久化策略

    持久化概念

    由于 redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率)。但是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。

    redis持久化是指在指定的时间间隔内将内存中的数据集快照(snapshotting)写入磁盘,恢复时是将快照文件读入内存,用来保证数据的持久性

    持久化策略

    Redis支持RDB持久化、AOF持久化、RDB-AOF混合持久化这三种持久化方式。

    RDB:

    RDB(Redis Database)是Redis默认采用的持久化方式,它以快照的形式将进程数据持久化到硬盘中

    RDB会创建一个经过压缩的二进制文件,文件以“.rdb”结尾,内部存储了各个数据库的键值对数据等信息

    RDB持久化的触发方式有两种:

    • 手动触发:通过SAVE或BGSAVE命令触发RDB持久化操作,创建“.rdb”文件;
    • 自动触发:通过配置选项,让服务器在满足指定条件时自动执行BGSAVE命令。

    例如手动触发:

    在这里插入图片描述
    就会生成一个rdb文件:
    在这里插入图片描述

    其中,SAVE命令执行期间,Redis服务器将阻塞,直到“.rdb”文件创建完毕为止。而BGSAVE命令是异步版本的SAVE命令,它会使用Redis服务器进程的子进程,创建“.rdb”文件。BGSAVE命令在创建子进程时会存在短暂的阻塞,之后服务器便可以继续处理其他客户端的请求。

    总结:BGSAVE命令是针对SAVE阻塞问题做的优化,Redis内部所有涉及RDB的操作都采用BGSAVE的方式,而SAVE命令已经废弃

    BGSAVE命令的执行流程,如下图:
    在这里插入图片描述
    BGSAVE命令的原理,如下图:
    在这里插入图片描述
    RDB持久化的优缺点如下:

    • 优点:RDB生成紧凑压缩的二进制文件,体积小,使用该文件恢复数据的速度非常快
    • 缺点:BGSAVE每次运行都要执行fork操作创建子进程,属于重量级操作,不宜频繁执行,所以RDB持久化没办法做到实时的持久化

    AOF

    AOF(Append Only File),解决了数据持久化的实时性,是目前Redis持久化的主流方式

    AOF以独立日志的方式,记录了每次写入命令,重启时再重新执行AOF文件中的命令来恢复数据

    AOF的工作流程包括:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load),如下图:

    在这里插入图片描述
    AOF默认不开启,需要修改配置项来启用它:

    修改配置文件内容,重启服务器:

    appendonly yes # 启用AOF 
    appendfilename "appendonly.aof" # 设置文件名
    
    • 1
    • 2

    在这里插入图片描述
    AOF以文本协议格式写入命令,如下面写入命令:

    *3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
    
    • 1

    文本协议格式具有如下的优点:

    1. 文本协议具有很好的兼容性;
    2. 直接采用文本协议格式,可以避免二次处理的开销;
    3. 文本协议具有可读性,方便直接修改和处理。
    AOF持久化的文件同步机制:

    为了提高程序的写入性能,现代操作系统会把针对硬盘的多次写操作优化为一次写操作。

    1. 当程序调用write对文件写入时,系统不会直接把数据写入硬盘,而是先将数据写入内存的缓冲区中;
    2. 当达到特定的时间周期或缓冲区写满时,系统才会执行flush操作,将缓冲区中的数据冲洗至硬盘中;

    这种优化机制虽然提高了性能,但也给程序的写入操作带来了不确定性。

    1. 对于AOF这样的持久化功能来说,冲洗机制将直接影响AOF持久化的安全性;
    2. 为了消除上述机制的不确定性,Redis向用户提供了appendfsync选项,来控制系统冲洗AOF的频率;
    3. Linux的glibc提供了fsync函数,可以将指定文件强制从缓冲区刷到硬盘,上述选项正是基于此函数。

    appendfsync选项的取值和含义如下:

    在这里插入图片描述

    AOF持久化的优缺点如下:

    • 优点:与RDB持久化可能丢失大量的数据相比,AOF持久化的安全性要高很多。通过使用everysec选项,用户可以将数据丢失的时间窗口限制在1秒之内
    • 缺点:AOF文件存储的是协议文本,它的体积要比二进制格式的”.rdb”文件大很多。AOF需要通过执行AOF文件中的命令来恢复数据库,其恢复速度比RDB慢很多AOF在进行重写时也需要创建子进程,在数据库体积较大时将占用大量资源,会导致服务器的短暂阻塞

    RDB-AOF混合持久化:

    Redis从4.0开始引入RDB-AOF混合持久化模式,这种模式是基于AOF持久化构建而来的。用户可以通过配置文件中的“aof-use-rdb-preamble yes”配置项开启AOF混合持久化。

    Redis服务器在执行AOF重写操作时,会按照如下原则处理数据:

    • 像执行BGSAVE命令一样,根据数据库当前的状态生成相应的RDB数据,并将其写入AOF文件中
    • 对于重写之后执行的Redis命令,则以协议文本的方式追加到AOF文件的末尾,即RDB数据之后

    通过使用RDB-AOF混合持久化,用户可以同时获得RDB持久化和AOF持久化的优点,服务器既可以通过AOF文件包含的RDB数据来实现快速的数据恢复操作,又可以通过AOF文件包含的AOF数据来将丢失数据的时间窗口限制在1s之内

  • 相关阅读:
    4、FFmpeg命令行操作8
    LXMERT:视觉语言跨模态框架
    gitlab git lfs的替代软件整理汇总及分析
    Redis性能压测、监控工具及优化方案
    python面试题——怎么实现时间的加减计算
    【记录】GLICB2.25 升级时报错
    Tomcat总体架构,启动流程与处理请求流程
    Java异常、SpringBoot中全局捕获处理异常
    网络安全考研院校推荐
    Openmp和MPI并行程序设计的区别
  • 原文地址:https://blog.csdn.net/weixin_45525272/article/details/126554539