如何在Redis持久化AOF重写期间保证各类复杂数据类型平稳写入?

夜辰君_5102

夜辰君_5102

2026-11-13

577人浏览

原创

AOF重写期间所有数据类型写入不受影响,命令同步写入aof_buf和aof_rewrite_buf_blocks两个独立缓冲区;需关注缓冲区膨胀、管道阻塞及子进程消费效率引发的OOM或延迟风险。

如何在redis持久化aof重写期间保证各类复杂数据类型平稳写入?

Redis AOF重写期间,String、Hash、List、Set、ZSet、Stream 等所有数据类型的写入行为完全不受影响——因为重写不修改任何现有数据结构,也不拦截命令执行路径。真正需要关注的,是这些写入能否被可靠捕获并最终落进新AOF文件。

重写期间新命令到底写到哪了

执行 BGREWRITEAOF 后,主进程仍照常处理所有客户端请求。每条成功执行的写命令(无论操作的是 SET 还是 XADD)会同步写入两个地方:

  • 追加到内存缓冲区 aof_buf,后续按 appendfsync 策略刷盘(保障旧AOF不丢)
  • 追加到专用重写缓冲区 aof_rewrite_buf_blocks(链表结构),仅用于向子进程传递增量

这两个缓冲区完全独立:aof_buf 负责老AOF的持续更新,aof_rewrite_buf_blocks 只为子进程消费而存在。你不需要、也不能手动干预它们的写入逻辑。

为什么大key或高频Stream写入容易出问题

重写期间的稳定性瓶颈不在数据类型本身,而在缓冲区承载能力与父子进程协同效率:

  • aof_rewrite_buf_blocks 是纯内存链表,无大小限制;若重写耗时长 + Stream 持续 XADD 或大 HSET 批量写入,可能快速吃光可用内存(OOM)
  • 父进程通过匿名管道向子进程推送 aof_rewrite_buf_blocks 内容;若子进程读取慢(比如磁盘IO高、CPU争抢),管道填满后 write() 会阻塞父进程,导致所有客户端请求延迟飙升
  • 某些场景下(如 LPUSH + LTRIM 频繁交替),虽命令有效,但重写子进程只基于当前内存快照生成最小命令集,不会保留中间状态——这是设计使然,不是故障

如何验证重写期间各类写入是否完整落地

不能只看 INFO persistence 里的 aof_pending_rewrite 是否为 0,要交叉验证三处:

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
  • 检查 aof_current_size 和 aof_base_size:重写完成后,前者应接近后者,且 aof_pending_bio_fsync 应归零
  • 用 redis-check-aof --fix 手动校验新AOF文件语法完整性(注意:仅限停机或从节点操作)
  • 对比重写前后 key 数量与关键业务 key 的值(例如用 SCAN + TYPE + GET/HEXISTS/XLEN 组合抽样)

特别注意:如果重写中途失败,Redis 会继续使用旧AOF恢复,但新写入已存在于 aof_buf 中并按策略落盘——所以旧AOF末尾其实已包含重写期间的部分命令,只是未被“压缩”。

生产环境必须盯住的几个硬指标

重写是否平稳,不取决于你写了什么数据类型,而取决于系统能否扛住缓冲膨胀和管道压力:

  • aof_rewrite_buffer_length(需通过调试模式或日志估算):它在源码中不直接暴露,但可通过 INFO memory 中 mem_clients_normal 异常增长间接感知
  • client-output-buffer-limit 对 pub/sub 客户端的影响会被放大——因主线程一旦被管道阻塞,所有输出缓冲区都可能积压
  • 子进程 fork 耗时超过 1 秒?说明内存过大或 THP 开启,这会拖慢整个重写启动节奏,间接拉长风险窗口

最易被忽略的一点:auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 触发的是「评估」,真正执行仍依赖 serverCron 周期轮询;如果你禁用了 serverCron 相关调度(如误配了 hz),重写可能迟迟不启动,导致 aof_rewrite_buf_blocks 持续累积。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

3511

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

574

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

602

19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4949

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4515

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

8772

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

683

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

9122

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero官方文档
Go-Zero官方文档

共0课时 | 0人学习