最近在看《Redis 設計與實現》,看到Redis的執行bgsave
生成dump.rdb
是根據CopyOnWrite
的
以前也不是很懂爲啥要有CopyOnWrite
這個東西
翻看文章搞明白了安全
若是有多個調用者(callers)同時請求相同資源(如內存或磁盤上的數據存儲),他們會共同獲取相同的指針指向相同的資源,直到某個調用者試圖修改資源的內容時,系統纔會真正複製一份專用副本(private copy)給該調用者,而其餘調用者所見到的最初的資源仍然保持不變。優勢是若是調用者沒有修改該資源,就不會有副本(private copy)被創建,所以多個調用者只是讀取操做時能夠共享同一份資源。線程
以前一直以爲CopyOnWrite很雞肋.設計
如今解釋一下:
CopyOnWrite
就是不一樣的線程操做不一樣的資源,最後再整合,所以是線程安全的,但不能保證強一致性指針
好比我如今數據 1234 我要插入5code
那麼原來的線程看到的數據是 1234 我新開的線程看到的數據是 12345
而且CopyOnWriteList
中的set
和add
方法都是加鎖了的,因此至多有一份拷貝。當這份拷貝資源執行完後,纔會釋放鎖,進行下次的set
或add
方法內存