对于AOF模块和命令层交互的理解

AOF 在 TinyRedis 里是旁路持久化模块,插在写命令执行链路旁边。普通客户端写命令执行成功后,CommandDispatcher 会通过 appendIfNeeded 判断是否需要写 AOF;如果是写命令、AOF 开启、并且不是 AOF replay 或复制回放,就调用 AOF::appendCommand,把 argv 编码成 RESP Array 追加到 appendonly.aof。

服务启动时,EpollServer::init 会先调用 CommandDispatcher::loadAof。loadAof 本身不直接读文件,而是调用 AOF::replay。AOF::replay 负责读取 AOF 文件,用 RESPParser 解析命令,再用 CommandParser 转成 argv;每解析出一条 argv,就通过 lambda 回调给 CommandDispatcher,执行 dispatchInternal(argv, true),把命令回放到 InMemoryDB。这里传 true 是为了避免 replay 过程中再次追加 AOF,也避免 replica 的 READONLY 逻辑影响内部回放。

AOF 的刷盘策略有 always、everysec、no 三种。always 是每次追加后立即 fsync;everysec 是追加后只标记 dirty_,由 cron 周期调用 flushIfNeeded,在距离上次 fsync 超过约 1 秒时刷盘;no 则不主动 fsync,交给操作系统。everysec 是性能和安全性的折中,宕机最多可能丢最近约 1 秒数据。

AOF rewrite 用于压缩 AOF 文件,不是定时每秒执行。REWRITEAOF 是同步 rewrite,会通过 snapshotCommands 从当前内存状态生成 SET/HSET/EXPIRE 等最小恢复命令,写入临时文件,fsync 后 rename 原子替换旧 AOF。BGREWRITEAOF 是后台 rewrite,startBackgroundRewrite 用后台线程写快照临时文件,主线程继续处理请求;rewrite 期间的新写命令正常追加旧 AOF,同时额外进入 backgroundRewriteBuffer_。后台完成后,pollBackgroundRewrite 在主线程收尾,把 buffer 追加到新临时文件末尾,再 rename 替换旧 AOF,保证 rewrite 期间的新写入不丢。

相关推荐
骇客野人5 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
.Bryce.8 小时前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
老男孩游戏时光11 小时前
# Redis分布式锁三种实现方案,踩坑记录
redis
石小千12 小时前
Redis开启ACL认证
数据库·redis·缓存
hweiyu0013 小时前
Redis命令:LPOS
redis·缓存
guo_wen_qiang13 小时前
云服务器redis主从复制-哨兵模式
运维·服务器·redis
for_ever_love__13 小时前
LangGraph State 设计:多节点之间怎么安全地共享数据
redis·mysql·状态模式·checkpoint·state·状态图·langgraph
大圣编蚕14 小时前
Redis 为什么快?现在还是单线程吗?
数据库·redis·缓存
Linux实战笔记14 小时前
记一次Redis分布式锁实现线上排查:Redlock算法与 Lua 脚本
redis·高并发·分布式锁·redlock 算法·lua 脚本
轮子大叔15 小时前
Redis深入浅出
redis·缓存