gpt4 book ai didi

redis - Redis 的字典实现中安全/非安全字典迭代器有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 06:16:06 28 4
gpt4 key购买 nike

我刚刚阅读了 dict 实现的 'dict.c' 源代码文件。我已经了解安全/非安全 dict 迭代器之间的字面区别,但还不明白为什么要引入非安全迭代器这个新概念的意图。

谷歌说“新的迭代器可能会执行更少无用的 COW”。 但我没弄清楚它是如何工作的,所以转向这里寻求帮助。

感谢任何帮助,最好有示例说明。

最佳答案

安全/非安全迭代器的目的是明确确定迭代是发生在可变数据结构上还是不可变数据结构上。在 dict 实现中,当正在进行安全迭代时,它会阻止对字典执行某些操作(例如重新散列)。

现在安全迭代器有一个缺点:它们需要在迭代对象本身中增加一个引用计数器,以便对象知道是否发生安全迭代。

Redis 利用操作系统的写时复制 (COW) 机制来处理后台转储。当发生转储时,会调用 fork 来克隆 Redis 实例并创建第二个进程。此过程将迭代整个数据以将所有内容序列化到转储文件中。由于 COW 机制,大部分页面在两个进程之间共享,因此 Redis 在转储数据时不会占用两倍的 RAM。

现在,只有在以只读模式访问页面时,页面才会被共享。当两个进程之一在内存中写入内容时,操作系统会自动复制相应的页面。

如果系统地使用安全迭代器来迭代所有字典,则会重复大量页面(因为引用计数器更新)。在克隆过程中,数据被认为是不可变的,因此使用不安全的迭代器可以减少 COW 事件。当您在 Redis 中有很多 set/hash/zset 对象时,这最相关。

关于redis - Redis 的字典实现中安全/非安全字典迭代器有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9223397/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com