redis根據(jù)數(shù)據(jù)的更新量和間隔時間定期將數(shù)據(jù)刷新到存儲中,相當于做checkpoint。
通過系統(tǒng)調(diào)用fork的copy-on-write的方式實現(xiàn)內(nèi)存的拷貝,保證刷數(shù)據(jù)時的一致性。
但是如果在刷數(shù)據(jù)期間數(shù)據(jù)發(fā)生大量變化,可能會造成內(nèi)存的大量copy-on-write,引起系統(tǒng)內(nèi)存拷貝的負載變化。
邏輯:
1.主進程調(diào)用fork 。
2.子進程關閉listen fd ,開始刷數(shù)據(jù)到存儲。
3.主進程調(diào)整策略,減少內(nèi)存數(shù)據(jù)更改。
redis的這種策略并不能保證數(shù)據(jù)可靠性,沒有write ahead日志,異常情況數(shù)據(jù)可能會丟失。
因此redis加入了append only的日志文件,以保證數(shù)據(jù)可靠,但是每次數(shù)據(jù)更新都寫日志的做法使得日志文件增長很快,redis使用跟刷數(shù)據(jù)類似
的方式后臺整理這個日志文件。
注:目前的數(shù)據(jù)庫一般通過write ahead日志保證數(shù)據(jù)可靠性,但是這種日志也不是實時刷新,而是寫到buffer中,被觸發(fā)刷新到文件。