网站技术方案说明,图片在线制作二维码生成器,群晖WordPress无端口号,wordpress的视频教程Redis会根据配置#xff0c;每隔一段时间中对Redis服务中当下的数据集进行快照。配置自动生成rdb文件#xff0c;后台使用的是bgsave方式。
save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可Redis借助操作系统提供的写时复制技术#xff08;Copy-On-Write, COW…Redis会根据配置每隔一段时间中对Redis服务中当下的数据集进行快照。配置自动生成rdb文件后台使用的是bgsave方式。
save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可Redis借助操作系统提供的写时复制技术Copy-On-Write, COW在生成快照的同时依然可以正常处理写命令。具体原理看下文介绍。
bgsave流程
Fork子进程
主进程调用fork() 创建一个子进程。子进程和主进程共享相同的内存空间。
子进程生成RDB文件
子进程根据fork时刻的数据快照生成RDB文件。子进程只读取fork时刻的数据不会读取之后的新数据。
主进程继续处理写操作
主进程继续处理客户端发来的写操作。对于写操作主进程使用写时复制Copy-On-Write, COW机制修改的数据所在的页复制一份将新数据写入新的内存区域。
替换现有RDB文件
子进程完成RDB文件生成后通知主进程。主进程将临时文件重命名为正式的RDB文件。
对新写入数据的处理
Fork时刻的数据快照
子进程生成的RDB文件包含了 fork 时刻的数据快照。这意味着从fork时刻到RDB文件生成完成这段时间内的新写入数据不会被包含在当前RDB文件中。
新写入数据的处理
主进程在fork之后接收到的所有写操作都会被记录在内存中。这些新写入的数据会存储在新的内存区域中不会影响子进程生成的RDB文件。
示例说明
假设主进程在 fork 时刻的状态如下
Key: foo Value: bar
Fork 子进程 子进程和主进程共享内存中的 “foo”: “bar”。主进程写操作 主进程接收到一个写操作SET foo baz。写时复制 主进程为 “foo” 分配新的内存空间并将值从 “bar” 改为 “baz”。 此时内存状态变为
Key: foo Value: bar // 子进程可见
Key: foo Value: baz // 主进程可见 子进程生成RDB文件 子进程读取 “foo”: “bar” 并生成RDB文件。替换现有RDB文件 子进程完成RDB文件生成后主进程用新的RDB文件替换旧文件。
后续处理
新RDB文件生成
下一次执行 bgsave 时新的RDB文件将会包含最新的数据快照包括之前写入的数据。
AOF日志
如果Redis配置了AOFAppend Only File持久化模式所有写操作都会被记录在AOF文件中。 即使RDB文件不包含最新的数据AOF文件也会确保数据的一致性和完整性。
总结
RDB快照bgsave 生成的是 fork 时刻的数据快照不包含fork之后的新写入数据。写时复制主进程在 fork 之后的新写入数据会存储在新的内存区域中。后续处理下一次 bgsave 会包含最新的数据快照。AOF日志如果启用AOF模式所有写操作都会被记录在AOF文件中确保数据的一致性和完整性。 这种方式保证了RDB文件的一致性和高可用性同时也提供了AOF模式作为补充确保数据的完整性和一致性。
欢迎关注鲁班曰
参考文献
Redis写时拷贝COW总结 Redis的写时复制Copy On Write你真的了解么