1. 程式人生 > >檔案的寫入和同步(對redis的AOF持久化理解)

檔案的寫入和同步(對redis的AOF持久化理解)

來源:
在讀《Redis設計與實現》的AOF持久化時,講到了AOF檔案的寫入與同步時,對於flushAppendOnlyFile函式,它就是實現持久化的函式,把記憶體中資料寫入檔案,這個函式的行為是由伺服器配置的appendfsync選項的值(如下圖)來決定的。
三種我們可以看到三個值都是將aof_buf緩衝區的所有內容寫入到aof檔案,只是同步時操作不一樣。對此,我們來理解一下寫入和同步!

解答:
在現代os中,為了提高檔案的寫入操作,當用戶呼叫到write函式將資料寫入檔案時,os先將資料寫入到一個記憶體緩衝區裡,正常是等到緩衝區滿了或是規定時間到了,才真正地將緩衝區裡的資料寫入磁碟,這時才是持久化完成。

類似你用記事本寫東西一樣,寫完之後你會Ctrl+v(儲存),但是在沒執行Ctrl+v的時候你也能看到自己寫的,這時因為儲存在記憶體緩衝區裡了,然後你儲存了,這才儲存到磁碟了,所以我們可以把你寫東西當做是對aof檔案的寫入,你執行Ctrl+v才是同步到磁碟操作。

這樣雖然大大提高了效率,但是很不安全,在你寫了好多字時,卡,忽然電腦停機了,寫的東西全沒了,就問你氣不氣?

所以appendfsync的選項值中的always、everysec都可以強制讓os立即將緩衝區裡的資料寫入硬碟。always是寫到緩衝區了立馬就同步到磁碟,everysec是寫到緩衝區的資料每秒就同步一次,丟失了也就丟失了上一秒內的資料,也不是很氣。