对于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 期间的新写入不丢。

相关推荐
二宝哥2 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
ShiXZ2138 小时前
Redis docker-compose 部署指南
redis·docker·eureka
青山木11 小时前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
YDS82911 小时前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
爬也要爬着前进1 天前
redis主从搭建
数据库·redis·缓存
用户095367515831 天前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌1 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群
明豆1 天前
Redis 分布式缓存生产实战
redis·分布式·缓存
海兰1 天前
【高速缓存】RedisVL 指南:从向量搜索到 AI 应用落地
人工智能·redis
weixin_727535621 天前
双Token认证体系深度拆解:Spring Security + JWT + Redis
redis·spring·wpf