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