• Redis持久化


    Redis是读写操作都在内存,关机就会丢失所有的信息,所以要进行持久化保存在磁盘中,有两种持久化方式:AOF和RDB。

    AOF

    AOF主要的持久化方式就是把执行成功的语句都写在一个AOF文件中,下次启动Redis服务时,自动执行这些语句。注意一定是先执行语句,再写入AOF文件,因为有的语句可能执行不成功,写入文件可能会出错

    AOF的缺点:

    1、数据可能会丢失。当Redis刚执行完命令,还未将命令写入磁盘时宕机了,这时这个数据就会丢失。
    2、可能会阻塞后续的操作。写入磁盘时依然在主线程中执行,所以可能会阻塞后续的操作。
    3、因为AOF是把执行操作的命令写入文件,当AOF文件很大时,执行会比较费时。

    AOF写回策略

    在这里插入图片描述

    AOF重写机制

    当AOF越写越大,超过了一个阈值时会触发重写机制。改机制是:读取数据库当前的所有键值对,把每个键值对用一条新命令写入一个新的AOF文件。写完这些命令时,再用新的AOF文件替换掉旧的AOF文件,这样就会起到压缩AOF文件的效果。重写机制是由子线程完成的
      例如:我执行两个set命令,set name A ;set name B 此时name是B,第一次执行的这个A可以不用记录在AOF文件中,因为name 此时是B。新的AOF文件就不记录set name A,只有set name B
    在子线程重写AOF日志时,主线程修改了某些键值对的值,此时,重写日志会和数据库中存储信息发生不一致。为防止这种情况,Redis每次执行完命令,会把该命令写入AOF日志缓冲区和AOF重写日志缓冲区。当子进程完成 AOF 重写工作(扫描数据库中所有数据,逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志)后,会向主进程发送一条信号,信号是进程间通讯的一种方式,且是异步的。

    主进程收到该信号后,会调用一个信号处理函数,该函数主要做以下工作:

    1、将 AOF 重写缓冲区中的所有内容追加到新的 AOF 的文件中,使得新旧两个 AOF 文件所保存的数据库状态一致;
    2、新的 AOF 的文件进行改名,覆盖现有的 AOF 文件。

    RDB

    RDB与AOF不同的是,RDB是用快照的方式,记录某一时间的真实数据,Redis在恢复时,直接将RDB文件读入内存即可,比AOF快。
    Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave,他们的区别就在于是否在「主线程」里执行:

    1、执行了 save 命令,就会在主线程生成 RDB 文件,由于和执行操作命令在同一个线程,所以如果写入 RDB 文件的时间太长,会阻塞主线程;
    2、执行了 bgsave 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞;

    RDB在执行快照时能修改吗?

    可以的,执行 bgsave 过程中,Redis 依然可以继续处理操作命令的,也就是数据是能被修改的,关键的技术就在于写时复制技术(Copy-On-Write, COW)。

    1、执行 bgsave 命令的时候,会通过 fork() 创建子进程,此时子进程和父进程是共享同一片内存数据的,因为创建子进程的时候,会复制父进程的页表,但是页表指向的物理内存还是一个,此时如果主线程执行读操作,则主线程和 bgsave 子进程互相不影响。
    2、如果主线程执行写操作,则被修改的数据会复制一份副本,然后 bgsave 子进程会把该副本数据写入 RDB 文件,在这个过程中,主线程仍然可以直接修改原来的数据。

    混合持久化

    RDB 优点是数据恢复速度快,但是快照的频率不好把握。频率太低,丢失的数据就会比较多,频率太高,就会影响性能。
    AOF 优点是丢失数据少,但是数据恢复不快。

    为了集成了两者的优点, Redis 4.0 提出了混合使用 AOF 日志和内存快照,也叫混合持久化,既保证了 Redis 重启速度,又降低数据丢失风险。
    在这里插入图片描述
    混合持久化工作在 AOF 日志重写过程,当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。

    也就是说,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。
    这样的好处在于,重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。

    加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主线程处理的操作命令,可以使得数据更少的丢失。

    混合持久化优点:

    混合持久化结合了 RDB 和 AOF 持久化的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合 AOF 的优点,有减低了大量数据丢失的风险。
    混合持久化缺点:

    AOF 文件中添加了 RDB 格式的内容,使得 AOF 文件的可读性变得很差;
    兼容性差,如果开启混合持久化,那么此混合持久化 AOF 文件,就不能用在 Redis 4.0 之前版本了。

  • 相关阅读:
    大数据之MapReduce
    DB-GPT发布:用私有LLM技术彻底改革数据库互动
    java毕业设计动漫周边产品销售管理系统Mybatis+系统+数据库+调试部署
    HTML5学习系列之项目实战1
    C#开发的OpenRA游戏之金钱系统(2)
    在PhpStorm中hyperf调试的方法步骤是什么
    require、loadfile、dofile、load、loadstring
    关于访问权限控制问题
    河流动力学复习
    【多AZ】浅述云计算多az
  • 原文地址:https://blog.csdn.net/weixin_44311466/article/details/126249902