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