2012-02-10 48 views
1

我剛剛讀過dict實現的'dict.c'源代碼文件。我已經理解了安全/非安全字典迭代器之間的字面差異,但尚未理解爲何引入非安全迭代器的新概念的意圖。redis'dict實現中的安全/非安全字典迭代器有什麼區別?

據谷歌說,「新的迭代器可能執行更少的無用的COW」。 但我不明白它是如何工作的,所以轉到這裏尋求幫助。

感謝您的幫助,以示例解釋會更好。

回答

1

安全/非安全迭代器的目的是清楚地確定迭代是否發生在可變數據結構或不可變數據結構上。在dict實現中,當安全迭代正在進行時,它會阻止某些操作(例如重新哈希)在字典上完成。

現在安全的迭代器有一個缺點:它們需要增加迭代對象本身的引用計數器,以便對象知道是否安全迭代。

Redis利用操作系統寫時拷貝(COW)機制來處理後臺轉儲。發生轉儲時,會調用fork來克隆Redis實例並創建第二個進程。該過程將對整個數據進行迭代以將所有內容序列化到轉儲文件中。由於COW機制,大多數頁面在兩個進程之間共享,所以Redis在轉儲數據時不會佔用兩倍的RAM。

現在只有在只讀模式下訪問頁面時纔會共享這些頁面。當兩個進程中的一個在內存中寫入內容時,操作系統會自動複製相應的頁面。

如果一個安全的迭代器被系統地用於遍歷所有的字典,大量的頁面將被複制(因爲引用計數器更新)。在克隆過程中,數據被認爲是不可變的,所以使用不安全的迭代器有助於減少COW活動。當你在Redis中有很多set/hash/zset對象時,這是最重要的。

相關問題