Redis_写时复制(cow)

Redis会根据配置,每隔一段时间中对Redis服务中当下的数据集进行快照。配置自动生成rdb文件,后台使用的是bgsave方式。

shell 复制代码
save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可

Redis借助操作系统提供的写时复制技术(Copy-On-Write, COW),在生成快照的同时,依然可以正常处理写命令。具体原理看下文介绍。

bgsave流程

  1. Fork子进程:
  • 主进程调用fork() 创建一个子进程。
  • 子进程和主进程共享相同的内存空间。
  1. 子进程生成RDB文件:
  • 子进程根据fork时刻的数据快照生成RDB文件。
  • 子进程只读取fork时刻的数据,不会读取之后的新数据。
  1. 主进程继续处理写操作:
  • 主进程继续处理客户端发来的写操作。
  • 对于写操作,主进程使用写时复制(Copy-On-Write, COW)机制,修改的数据所在的页,复制一份,将新数据写入新的内存区域。
  1. 替换现有RDB文件:
  • 子进程完成RDB文件生成后,通知主进程。
  • 主进程将临时文件重命名为正式的RDB文件。

对新写入数据的处理

  1. Fork时刻的数据快照:
  • 子进程生成的RDB文件包含了 fork 时刻的数据快照。
  • 这意味着从fork时刻到RDB文件生成完成这段时间内的新写入数据不会被包含在当前RDB文件中。
  1. 新写入数据的处理:
  • 主进程在fork之后接收到的所有写操作都会被记录在内存中。
  • 这些新写入的数据会存储在新的内存区域中,不会影响子进程生成的RDB文件。

示例说明

假设主进程在 fork 时刻的状态如下:

text 复制代码
Key: "foo" Value: "bar"
  • Fork 子进程:
    子进程和主进程共享内存中的 "foo": "bar"。
  • 主进程写操作:
    主进程接收到一个写操作:SET foo baz。
  • 写时复制:
    主进程为 "foo" 分配新的内存空间,并将值从 "bar" 改为 "baz"。
    此时内存状态变为:
text 复制代码
Key: "foo" Value: "bar"  // 子进程可见
Key: "foo" Value: "baz"  // 主进程可见  
  • 子进程生成RDB文件:
    子进程读取 "foo": "bar" 并生成RDB文件。
  • 替换现有RDB文件:
    子进程完成RDB文件生成后,主进程用新的RDB文件替换旧文件。

后续处理

新RDB文件生成:

下一次执行 bgsave 时,新的RDB文件将会包含最新的数据快照,包括之前写入的数据。

AOF日志:

如果Redis配置了AOF(Append Only File)持久化模式,所有写操作都会被记录在AOF文件中。

即使RDB文件不包含最新的数据,AOF文件也会确保数据的一致性和完整性。

总结

  • RDB快照:bgsave 生成的是 fork 时刻的数据快照,不包含fork之后的新写入数据。
  • 写时复制:主进程在 fork 之后的新写入数据会存储在新的内存区域中。
  • 后续处理:下一次 bgsave 会包含最新的数据快照。
  • AOF日志:如果启用AOF模式,所有写操作都会被记录在AOF文件中,确保数据的一致性和完整性。
    这种方式保证了RDB文件的一致性和高可用性,同时也提供了AOF模式作为补充,确保数据的完整性和一致性。

欢迎关注:鲁班曰

参考文献

Redis写时拷贝(COW)总结
Redis的写时复制(Copy On Write),你真的了解么?

相关推荐
崔庆才丨静觅8 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
陌上丨9 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
passerby60619 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅9 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅9 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅10 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅10 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊10 小时前
jwt介绍
前端