网站微信开发,页面优化诊断,国外 上海网站建设,郑州网站建设制作费用执行了 save 命令#xff0c;会在主进程生成 RDB 文件#xff0c;由于和执行操作命令在同一个线程#xff0c;所以如果写入 RDB 文件的时间太长#xff0c;会阻塞主进程。
执行 bgsave 过程中#xff0c;由于是交给子进程来构建 RDB 文件#xff0c;主进程还是可以继续工…执行了 save 命令会在主进程生成 RDB 文件由于和执行操作命令在同一个线程所以如果写入 RDB 文件的时间太长会阻塞主进程。
执行 bgsave 过程中由于是交给子进程来构建 RDB 文件主进程还是可以继续工作的此时主进程依然可以继续处理操作命令也就是数据是能被修改的关键的技术就在于写时复制技术。
执行 bgsave 命令的时候主进程会通过 fork() 创建子进程此时子进程和父进程是共享同一片内存数据的因为在创建子进程的时候会复制父进程的页表且页表指向的物理内存是同一个此时如果主进程执行读操作则主进程和 bgsave 子进程互不影响。 如果主进程执行写操作则被修改的数据会复制一份副本然后 bgsave 子进程会把它的副本数据写入 RDB 文件在这个过程中主进程仍然可以直接修改原来的数据。
注意只有在发生修改内存数据的情况时物理内存才会被复制一份。 举例来说如果主进程要修改共享数据里的某一块数据比如键值对 A时就会发生写时复制。于是这块数据的物理内存就会被复制一份键值对 A’。然后主进程在这个数据副本键值对 A’上进行修改操作。与此同时bgsave 子进程可以继续把原来的数据键值对 A写入到 RDB 文件。
注意在发生了写时复制后RDB 快照保存的是原本的内存数据而主进程刚修改的数据是没办法在这一时间写入 RDB 文件的只能交由下一次的 bgsave 快照。
所以 Redis 在使用 bgsave 快照过程中如果主进程修改了内存数据不管是否是共享的内存数据RDB 快照都无法写入主进程刚修改的数据因为此时主进程的内存数据和子进程的内存数据已经分离了子进程写入到 RDB 文件的内存数据只能是原本的内存数据快照的定义。
如果系统恰好在 RDB 快照文件创建完毕后崩溃了那么 Redis 将会丢失主进程在快照期间修改的数据。