redis AOF机制

2024-08-21 05:44
文章标签 redis 机制 aof

本文主要是介绍redis AOF机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
在redis运行期间,不断将redis执行的写命令写到文件中,redis重启之后,只要将这些命令重复执行一遍就可以恢复数据。因为AOF只是将少量的写命令写入AOF文件中,因此其执行效率高于RDB,开启AOF即使Redis发生故障,丢失的数据也较少。

appendonly yes
appendfilename appendonly.aof

aof重写:随着命令不断添加aof文件会越来越大,redis会进行aof的重写,每个健只会写入最后一次命令,已删除或过期的数据相关命令将抹去。

  1. AOF定时逻辑
    1. 判断是否存在AOF重写操作,若当前没有子进程则执行AOF重写操作
    2. AOF重写条件
      1. AOF文件大于server.aof_rewrite_min_size
      2. 上次AOF重写后的文件大小,当前AOF文件增加的空间大小比例已经超过了server.aof_rewrite_perc配置,此配置默认为100.例如上次重写aof大小为80MB,现在aof文件有160了,则满足重写要求。
    3. 存在延迟的AOF缓冲区刷新操作,则将数据从缓冲区刷到文件中。
    4. 每经过一段时间,执行:若上次AOF缓冲区刷新操作中写入磁盘出错,则再次刷新缓冲区
  2. AOF持久化过程
    1. 命令传播
      1. 对带EXPIRE、EXPIREAT、PEXPIRE、SETEX、PSETEX,或者带EX、PX选项的SET命令做特殊处理。因为这些命令带有过期时间,需要将这些命令转换为PEXPIREAT命令,将过期时间的时间戳写入buf暂存区。
      2. 对于其他命令将命令写入buf暂存区
      3. 若服务器开启AOF功能,则将buf暂存区内容写入AOF缓冲区
      4. 如果当前线程正在执行AOF重写操作,则还需将buf暂存区内容写入到AOF重写缓冲区
    2. 刷新AOF缓冲区
      1. 当AOF缓冲区为空时,如果刷盘策略为每秒同步,且当前存在待同步的数据,距上次同步已经过去一秒,则开始同步。否则退出。
      2. 检查后台线程是否正在执行同步操作,若存在则执行以下逻辑:若同步策略为每秒同步,则延迟AOF缓冲区刷新操作。如果已经延迟多次且延迟时间超过2秒,则强制刷新AOF缓冲区。
      3. 将AOF缓冲区内容写入文件
      4. aof缓冲区内容刷新成功后,若aof总空间小于4kb,则清空并重用aof缓冲区,否则新建一个新的缓冲区。
    3. 同步磁盘
      1. 刷盘策略:
        1. 不执行fsync,速度快的安全性低
        2. 执行fsync,安全性高速度慢
        3. 每个一秒执行fsync,折中处理
      2. 如果程序存在子进程,且开了server.aof_no_fsync_on_rewrite配置,就不同步磁盘
      3. 若刷盘策略是每次同步(2),则开始同步磁盘
      4. 若刷盘策略为每秒同步,且距上次同步已经过去一秒,则添加一个后台任务同步磁盘
  3. AOF重写
    1. aof混合持久化
      1. 若开启混合持久化,在AOF重写时,会将redis数据以RDB格式保存到新文件中,再将重写缓冲区增量写命令以aof格式写入文件。
    2. 重写过程:
      1. fork一个子进程(aof进程),负责将当前内存数据保存到一个新文件中
        1. 打开一个临时文件并初始化rio变量
        2. 若开启了aof持久化,则生成rdb文件到临时文件中,否则将redis数据转化为写入命令写入临时文件
        3. 重复从server.aof_pipe_read_data_from_parent读取增量命令:
          1. 读取时间超过一秒或者连续20毫秒没有读取到则停止
          2. 若没有读取到增量命令则阻塞一秒等待增量命令
        4. 通知主进程(父进程)停止发送增量命令
        5. 再一次从server.aof_pipe_read_data_from_parent读取增量命令
        6. 将暂存区内容写入文件并同步磁盘
        7. 重命名文件
      2. 将步骤一执行期间的增量命令写入新文件中
      3. 主进程收尾,将步骤二执行期间主进程执行的赠礼命令写入新文件中,替换新的AOF文件
        1. 打开aof进程创建的文件
        2. 将重写缓冲区内容写入临时文件
        3. 重命名文件进行替换
        4. 磁盘同步并清空server.aof_buf内容
  4. AOF文件加载
    1. 打卡aof文件
    2. 创建一个伪客户端,执行aof文件中的命令
    3. 如果文件以redis标志开头,则该aof文件是混合持久化方式生成,需调用处理RDB内容的函数加载RDB内容
    4. 处理aof文件中的命令
    5. 按照RESP协议格式,读取命令参数数量
    6. 读取每一个参数
    7. 查找命令redisCommand
    8. 调用redisCommand.proc执行命令

这篇关于redis AOF机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092288

相关文章

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

Redis分布式锁中Redission底层实现方式

《Redis分布式锁中Redission底层实现方式》Redission基于Redis原子操作和Lua脚本实现分布式锁,通过SETNX命令、看门狗续期、可重入机制及异常处理,确保锁的可靠性和一致性,是... 目录Redis分布式锁中Redission底层实现一、Redission分布式锁的基本使用二、Red

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

Spring Integration Redis 使用示例详解

《SpringIntegrationRedis使用示例详解》本文给大家介绍SpringIntegrationRedis的配置与使用,涵盖依赖添加、Redis连接设置、分布式锁实现、消息通道配置及... 目录一、依赖配置1.1 Maven 依赖1.2 Gradle 依赖二、Redis 连接配置2.1 配置 R

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R