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),你真的了解么?

相关推荐
用户203119660096几秒前
空合并运算符
前端·后端
我头上有犄角ovo2 分钟前
🤯 什么?!还在跪求后端大佬帮你上线项目?NodeSSH 让你前端也能玩转部署:从求人到自主的逆袭之路!
前端
app1e23422 分钟前
ctfshow web入门 命令执行(29-77)
android·前端
wordbaby25 分钟前
AbortController 详解:如何优雅地取消异步操作
前端
程序员爱钓鱼25 分钟前
从零开始开发一个简易的五子棋游戏:使用 HTML、CSS 和 JavaScript 实现双人对战
前端·javascript·游戏开发
林太白27 分钟前
NestJS企业级登录注册如何做
前端·javascript·后端
cong_30 分钟前
🔥 我的开源项目火了!竟被各个公众号转发
前端·后端·github
五号厂房36 分钟前
React 中如何使用自定义Hook封装可复用逻辑
前端
icefiresong2436 分钟前
使用 Node.js 和 Git 自动化部署项目
前端
码云之上38 分钟前
聊聊MCP Client及其实践
前端·架构·mcp