讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

Redis AOF 重写过程中有新的写入怎么通过重写缓冲区合并

梦晨酱_8556

梦晨酱_8556

发布时间:2026-09-07 14:46:07

|

634人浏览过

|

来源于php中文网

原创

不会丢失,因重写期间新命令同步写入独立的aof_rewrite_buf_blocks缓冲区,并通过管道实时推送至子进程;子进程完成快照后追加全部增量,最后原子替换文件,确保数据完整且不重复。

redis aof 重写过程中有新的写入怎么通过重写缓冲区合并

Redis AOF 重写过程中,新写入命令不会丢失,也不会重复,核心靠的是重写缓冲区(aof_rewrite_buf_blocks)与写时复制(Copy-on-Write)机制协同工作。它不是“合并”旧命令,而是暂存重写期间产生的增量变更,等子进程完成基础快照写入后,再把这部分增量追加进去,确保新AOF文件完整反映重写开始时刻的数据库状态 + 重写过程中的所有修改。

为什么需要重写缓冲区?

fork 子进程时,操作系统采用写时复制技术:子进程初始共享父进程内存页,但一旦父进程修改某块内存(比如执行 SET key val),内核会为父进程单独拷贝该页,子进程仍看到 fork 时刻的原始值。这意味着:

  • 子进程只能基于 fork 那一瞬的内存快照生成新 AOF 文件;
  • fork 后父进程继续处理客户端请求,这些新命令必须被记录下来,否则重写完成时就会丢数据;
  • AOF 缓冲区(aof_buf)仍按原有策略(如 everysec)刷盘,服务于当前 AOF 文件,不能直接挪给重写流程用;
  • 所以 Redis 单独开辟了 aof_rewrite_buf_blocks——一个链表结构的缓冲区,专用于暂存重写期间的所有写命令。

重写缓冲区怎么接收新写入?

每当父进程执行完一个写命令(如 INCR、RPUSH),在将命令追加到 aof_buf 的同时,也会以协议格式同步写入 aof_rewrite_buf_blocks 链表末尾。这个过程是原子且即时的,不依赖 flushAppendOnlyFile 调度。关键点:

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 每个缓冲块默认大小为 10MB(AOF_RW_BUF_BLOCK_SIZE = 10*1024*1024),满则自动分配新块;
  • 命令以 Redis 通信协议格式(如 *3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n)写入,和 AOF 文件格式完全一致;
  • 它只记录写命令,不记录读命令或过期键(因为过期键在重写时已被过滤);
  • 即使重写耗时数秒,这块缓冲区也能持续承载高并发写入,只要内存够用。

子进程如何拿到并写入这些增量?

子进程不直接访问父进程内存,而是通过 Unix 域管道(pipe)接收父进程主动推送的数据:

  • 父进程在 fork 后,会将 aof_rewrite_buf_blocks 中已有的内容,以及后续新增内容,分批次通过管道发送给子进程;
  • 子进程从管道读取命令流,原样追加到正在构建的临时 AOF 文件末尾;
  • 当子进程完成快照部分(如遍历 db、生成 SET/RPUSH 等精简命令)后,会继续读取管道直到 EOF,确保所有增量都被写入;
  • 子进程退出前,临时文件已包含“全量快照 + 全部增量”,逻辑上等价于重写开始时刻起的最新状态。

最后一步:原子替换与数据一致性

子进程退出后,父进程做收尾操作:

  • 检查子进程退出状态,确认重写成功;
  • 将 aof_rewrite_buf_blocks 中可能尚未发完的最后一点数据(如有)也追加进临时文件;
  • 调用 rename(2) 原子地将临时文件覆盖原 AOF 文件(如从 appendonly.aof.tmp → appendonly.aof);
  • 整个过程无锁、无中断,客户端全程可读可写,新 AOF 文件上线即生效,不会出现命令缺失或重复。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

4929

2023.11.02

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

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

4495

2023.11.14

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

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

8732

2024.04.02

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

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

683

2024.04.07

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

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

776

2024.04.07

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

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

9062

2024.04.07

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1200

2024.04.07

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1456

2024.04.07

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

0

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn