文章原文:
若主线程对内存数据执行读请求(示意图中的键值对 A)则主线程和 bgsave 子进程互不影响,若主线程对【内存数据】执行写请求(示意图中的键值对 C)则会为写请求操作的数据生成副本数据,bgsave 子进程会将副本数据写至 RDB 文件,在此过程中主线程仍可直接修改原数据
我的问题:
对【bgsave 子进程会将副本数据写至 RDB 文件】不理解,是否表示此时 RDB 文件会存储两份【键值对 C】?一份是旧的【键值对 C】,一份是主线程修改过的【键值对 C】?还是说 RDB 快照仅存储一份(即最新的)键值对 C?
对,存两份数据,一份本来的数据供主线程修改,另一份拿给子线程去读。这个东西本质是这样的,主线程的数据会很大,子线程不可能完整去内存copy一份出来嘛再写到硬盘嘛,所以直接引用过来。那么过程中间,主线程修改了数据咋办,那么把要修改的数据单独copy一份出来供子线程去读就可以了。
希望能帮助到你。