zoukankan      html  css  js  c++  java
  • redis 学习(18)-- AOF

    redis -- AOF

    什么是 AOF

    通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中。

    日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中。

    当redis服务器启动时候,执行硬盘中的日志文件以恢复redis中的数据。

    AOF 运行原理 - 创建

    AOF 运行原理 - 恢复

    AOF 的三种策略

    1. always

    含义:执行每条写命令都会将写命令写到磁盘中

    2. everysec

    含义:每秒将数据从缓冲区刷到磁盘中,可能会丢失一秒的数据(redis 默认使用该策略)

    3. no

    含义:写命令何时刷新的磁盘中,由操作系统来决定

    AOF 重写

    注意这里的重写并不是说将 redis 命令重新抽象成新的 redis 命令,再写入 AOF 文件,而是执行 redis 命令后将内存中的数据进行回溯,重写成 AOF 文件。

    1. 重写的作用
    • 减少磁盘占用
    • 加速AOF恢复速度
      • 例如一万次incr key 可以重写为 set key 10000
    2. AOF 重写实现方式 - bgrewriteaof

    客户端发送出一条bgrewriteaof命令后,redis会fork一个子进程完成AOF重写操作逻辑。

    3. AOP 重写实现方式 - AOF 重写配置
    • AOF配置项
    配置 默认值 含义
    auto-aof-rewrite-min-size 64MB AOF文件重写需要的尺寸,AOF多大时开启重写
    auto-aof-rewrite-percentage 100 AOF文件增长率
    (当前AOF文件大小超过上一次重写的AOF
    文件大小的百分之多少才会重写)
    • AOF统计项

      统计名 含义
      aof_current_size AOF当前尺寸(单位:字节)
      aof_base_size AOF上次启动和重写的尺寸(单位:字节)
    • 自动触发时机

      • 当前 AOF 文件大小超过最小重写尺寸
      • 当前 AOF 文件大小超过上次重写完的 AOF 尺寸的百分之多少(auto-aof-rewrite-percentage
    aof_current_size > auto-aof-rewrite-min-size
    (aof_current_size - aof_base_size) / aof_base_size > auto-aof-rewrite-percentage 
    

    AOF 相关配置

    配置项 最佳取值 含义
    appendonly yes 开启AOF
    appendfilename aof-${port}.aof AOF文件名
    appendfsync everysec AOF策略
    dir /redisDataPath AOF文件所在目录
    no-appendfsync-no-rewrite yes 在执行重写时不进行AOF操作
    auto-aof-rewrite-percentage 100 AOF重写配置(见上文)
    auto-aof-rewrite-min-size 64MB AOF重写配置(见上文)

    AOF 重写原理

    AOF重写不会读取老的AOF文件,而是根据当前服务器的状态生成一份新的AOF文件,将老的AOF文件进行替换。

    AOF 重写流程

    演示

    redis 支持动态配置,我们开启 AOF,其他配置保持不变。

    conf set appendonly yes
    

    我们添加几个数据:

    /opt/soft/redis/data/ 目录下查看,可以看到,AOF 文件已经生成了,使用 more 命令查看 aof 文件:

    看得不太清楚,我们用 head 命令打印 aof 文件头部信息:

    使用重写命令:

    我们使用 dbszie 重新查看一下数据大小,可以看到文件非常小,只有三个 key:

    打印一下重写后的 appendonly.aof :

    可以看到重写后的命令变成了:

    seletc 0
    set counter 2
    set counter redis
    rpush list a b c
    
  • 相关阅读:
    使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?
    ubuntu开发机所需工具,做个记录,不断补充
    c cpp编程用到的系统边角与其拾遗
    几个递进的make file
    可以用命令行控制eclipse断点增加删除、远程调试创建与启动的插件
    Mac 从睡眠恢复后没有声音的问题
    [netty4][netty-handler]netty之idle handler处理
    《将博客搬至CSDN》
    python2与python3中__metacalss__的不同用法
    python3 type和object的关系
  • 原文地址:https://www.cnblogs.com/weixuqin/p/10968836.html
Copyright © 2011-2022 走看看