|NO.Z.00021|——————————|BigDataEnd|——|Hadoop&Redis.V03|——|Redis.v03|AOF机制|
一、AOF
### --- AOF
~~~ # AOF(append only file)是Redis的另一种持久化方式。
~~~ Redis默认情况下是不开启的。开启AOF持久化后
~~~ # Redis 将所有对数据库进行过写入的命令(及其参数)(RESP)记录到 AOF 文件,
~~~ 以此达到记录数据库状态的目的,
~~~ 这样当Redis重启后只要按顺序回放这些命令就会恢复到原始状态了。
~~~ AOF会记录过程,RDB只管结果
### --- AOF持久化实现
~~~ # 配置 redis.conf
~~~ 可以通过修改redis.conf配置文件中的appendonly参数开启
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。
dir ./
# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改
appendfilename appendonly.aof
### --- AOF原理
~~~ # AOF文件中存储的是redis的命令,
~~~ 同步命令到 AOF 文件的整个过程可以分为三个阶段:
~~~ # 命令传播:
~~~ Redis 将执行完的命令、命令的参数、命令的参数个数等信息发送到 AOF 程序中。
~~~ # 缓存追加:AOF 程序根据接收到的命令数据,将命令转换为网络通讯协议的格式,
~~~ 然后将协议内容追加到服务器的 AOF 缓存中。
~~~ # 文件写入和保存:AOF 缓存中的内容被写入到 AOF 文件末尾,
~~~ 如果设定的 AOF 保存条件被满足的话,
~~~ fsync 函数或者 fdatasync 函数会被调用,将写入的内容真正地保存到磁盘中。
### --- 命令传播
~~~ 当一个 Redis 客户端需要执行命令时, 它通过网络连接,
~~~ 将协议文本发送给 Redis 服务器。服务器在接到客户端的请求之后,
~~~ 它会根据协议文本的内容, 选择适当的命令函数,
~~~ 并将各个参数从字符串文本转换为 Redis 字符串对象( StringObject )。
~~~ 每当命令函数成功执行之后, 命令参数都会被传播到AOF 程序。
### --- 缓存追加
~~~ # 当命令被传播到 AOF 程序之后,
~~~ 程序会根据命令以及命令的参数, 将命令从字符串对象转换回原来的协议文本。
~~~ 协议文本生成之后, 它会被追加到 redis.h/redisServer 结构的 aof_buf 末尾。
~~~ # redisServer 结构维持着 Redis 服务器的状态,
~~~ aof_buf 域则保存着所有等待写入到 AOF 文件的协议文本(RESP)。
### --- 文件写入和保存
~~~ 每当服务器常规任务函数被执行、 或者事件处理器被执行时,
~~~ aof.c/flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作:
~~~ # WRITE:
~~~ 根据条件,将 aof_buf 中的缓存写入到 AOF 文件。
~~~ # SAVE:
~~~ 根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
### --- AOF 保存模式
~~~ Redis 目前支持三种 AOF 保存模式,它们分别是:
~~~ AOF_FSYNC_NO :不保存。 AOF_FSYNC_EVERYSEC :每一秒钟保存一次。(默认)
~~~ AOF_FSYNC_ALWAYS :每执行一个命令保存一次。
~~~ (不推荐) 以下三个小节将分别讨论这三种保存模式。
### --- 不保存
~~~ 在这种模式下, 每次调用 flushAppendOnlyFile 函数, WRITE 都会被执行, 但 SAVE 会被略过。
~~~ 在这种模式下, SAVE 只会在以下任意一种情况中被执行:
~~~ Redis 被关闭 AOF 功能被关闭 系统的写缓存被刷新(可能是缓存已经被写满,
~~~ 或者定期保存操作被执行) 这三种情况下的 SAVE 操作都会引起 Redis 主进程阻塞。
### --- 每一秒钟保存一次(推荐)
~~~ 在这种模式中, SAVE 原则上每隔一秒钟就会执行一次,
~~~ 因为 SAVE 操作是由后台子线程(fork)调用的, 所以它不会引起服务器主进程阻塞。
### --- 每执行一个命令保存一次
~~~ 在这种模式下,每次执行完一个命令之后, WRITE 和 SAVE 都会被执行。
~~~ 另外,因为 SAVE 是由 Redis 主进程执行的,所以在 SAVE 执行期间,
~~~ 主进程会被阻塞,不能接受命令请求。
~~~ AOF 保存模式对性能和安全性的影响
二、对于三种 AOF 保存模式, 它们对服务器主进程的阻塞情况如下:
模式 | WRITE是否阻塞? | SAVE是否阻塞? | 停机时丢失的数据量 |
AOF_FSUNC_NO | 阻塞 | 阻塞 | 操作系统最后一次对AOF文件触发SAVE操作之后的数据 |
AOF_FSYNC_EVERYSEC | 阻塞 | 不阻塞 | 一般情况下不超过2秒钟的数据。 |
AOF_FSYNC_ALWAYS | 阻塞 | 阻塞 | 最多只丢失一个命令的数据 |
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv012-redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通