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执行命令
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis AOF是一种持久化机制,用于将Redis服务器的操作日志以追加的方式记录在磁盘上。引用中提到,当AOF文件的体积变得过大时,Redis可以自动进行AOF重写。AOF重写实际上是对当前数据集所需的最小命令集合进行重写,而不是对原有的AOF文件进行写入和读取操作。这个重写过程是在后台进行的,通过fork子进程来执行。重写后的新AOF文件能够恢复当前数据集的状态。 引用中提到,RedisAOF重写程序放在后台子进程中执行的原因是为了避免影响服务器的请求处理能力。通过将AOF重写程序放在后台执行,可以确保服务器能够继续处理请求,而不会被AOF重写过程阻塞。 在Redis服务器中,redisServer结构维护着服务器的状态,而aof_buf域则用来保存等待写入AOF文件的协议文本(RESP)。这些协议文本包含了对键的操作命令,用于记录服务器的操作日志。当需要将操作日志写入AOF文件时,这些协议文本会被写入到AOF缓冲区中,然后由后台的AOF子进程负责将缓冲区中的内容写入到AOF文件中。这种方式可以提高性能,并且减少了直接写入文件的开销。引用中提到了这一点。 综上所述,RedisAOF机制是通过记录操作日志来实现数据持久化的。当AOF文件体积过大时,Redis会自动进行AOF重写,将当前数据集所需的最小命令集合写入一个新的AOF文件中。为了避免影响服务器的请求处理能力,AOF重写过程会在后台执行。通过维护一个AOF缓冲区,Redis可以将待写入的协议文本暂时保存在内存中,然后由后台子进程负责将其写入AOF文件中。这种机制可以提高性能并减少直接写入文件的开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值