我刚刚阅读了dict实现的'dict.c'源代码文件。我已经得到了安全/非安全dict迭代器之间的字面差异,但还没有理解为什么要引入非安全迭代器的新概念。
据谷歌称,“新迭代器可能会执行较少无用的COW”。 但我无法弄清楚它是如何工作的,所以转到这里寻求帮助。
感谢任何帮助,以示例解释会更好。
答案 0 :(得分:1)
安全/非安全迭代器的目的是清楚地确定迭代是否发生在可变或不可变的数据结构上。在dict实现中,当安全迭代正在进行时,它会阻止在字典上完成一些操作(例如重新散列)。
现在安全迭代器有一个缺点:它们需要在迭代对象本身中增加一个引用计数器,以便对象知道是否发生了安全迭代。
Redis利用OS写时复制(COW)机制来处理后台转储。发生转储时,调用fork来克隆Redis实例并创建第二个进程。此过程将迭代整个数据,以将所有内容序列化到转储文件中。由于COW机制,大多数页面在两个进程中共享,因此Redis在转储数据时不占用两倍的RAM。
现在只有在以只读模式访问页面时才会共享这些页面。当其中一个进程在内存中写入内容时,操作系统会自动复制相应的页面。
如果系统地使用安全迭代器来迭代所有字典,则会复制大量页面(因为引用计数器更新)。在克隆过程中,数据被认为是不可变的,因此使用不安全的迭代器可以减少COW活动。当你在Redis中有很多set / hash / zset对象时,这几乎是相关的。