RDB:當Redis保存dump.rdb
文件時,Redis server執行以下操作
- Redis調用focks(),此時擁有父進程和子進程
- 利用子進程將數據寫入(IO)一個臨時rdb文件中
- 當子進程完成寫入後,redis會用新rdb文件替代舊的,並刪除舊rdb文件
缺點:
- 數據容易丟失(數據完整性)
- 當寫入的數據量較大時,不能夠及時響應客戶端的請求
AOF 重寫和 RDB 創建快照一樣,都巧妙地利用了寫時複製機制:
- Redis 執行 fork() ,現在同時擁有父進程和子進程。
- 子進程開始將新 AOF 文件的內容寫入到臨時文件。
- 對於所有新執行的寫入命令,父進程一邊將它們累積到一個內存緩存中,一邊將這些改動追加到現有 AOF 文件的末尾,這樣樣即使在重寫的中途發生停機,現有的 AOF 文件也還是安全的。
- 當子進程完成重寫工作時,它給父進程發送一個信號,父進程在接收到信號之後,將內存緩存中的所有數據追加到新 AOF 文件的末尾。
- 現在 Redis 原子地用新文件替換舊文件,之後所有命令都會直接追加到新 AOF 文件的末尾。
待更新…