一、redis儲存在記憶體中,如果伺服器斷電或者重啟,記憶體中的資料會被清理,所以需要對redis持久化操作,保證資料庫的完整性;
二、redis持久化的方式:快照、aof日誌;
三、快照與aof各自特點:
1、快照是一次全量備份,aof 日誌是連續的增量備份
2、快照是記憶體資料的二進位制序列化形式,在儲存上非常緊湊,而 aof 日誌記錄的是記憶體資料修改的指令記錄文字
3、aof 日誌在長期的執行過程中會變的無比龐大,資料庫重啟時需要載入 aof 日誌進行指令重放,這個時間就會無比漫長,定期需要對aof重寫,使其**
四、快照工作原理:
1、redis 使用作業系統的多程序 cow(copy on write) 機制來實現快照持久化
2、fork(多執行緒)原理:
redis 在持久化時會呼叫 glibc 的函式fork產生乙個子程序,快照持久化完全交給子程序來處理,父程序繼續處理客戶端請求。子程序剛剛產生時,它和父程序共享記憶體裡面的**段和資料段。這是 linux 作業系統的機制,為了節約記憶體資源。
子程序做持久化,不會修改記憶體資料結構,只是對資料遍歷讀取、序列化、寫磁碟;父程序接受客戶端請求,對記憶體資料結構不斷修改。這個時候就會使用作業系統的 cow 機制來進行資料段頁面的分離。資料段是由很多作業系統的頁面組合而成,當父程序對其中乙個頁面的資料進行修改時,會將被共享的頁面複製乙份分離出來,然後對這個複製的頁面進行修改。這時子程序相應的頁面是沒有變化的,還是程序產生時那一瞬間的資料就凝固了,再也不會改變,這也是被稱為快照的原因,接下來子執行緒可以遍歷資料,序列化到磁碟
五、aof日誌工作原理:
1、aof 日誌儲存的是 redis 伺服器的順序指令序列,aof 日誌只記錄對記憶體進行修改的指令記錄。
2、redis 會在收到客戶端修改指令後,進行引數校驗進行邏輯處理後,如果沒問題,就立即將該指令文字儲存到 aof 日誌中,也就是先執行指令才將日誌存檔
3、leveldb、hbase等儲存引擎,它們都是先儲存日誌再做邏輯處理。
4、redis在長期執行的過程中,aof日誌會越來越長,如果宕機,重放整個日誌會很耗時,所以要進行aof重寫即**
5、redis 提供了 bgrewriteaof 指令對 aof 日誌進行**。
6、**原理:當aof檔案達到配置檔案配置的大小時,開闢乙個子程序對記憶體進行遍歷轉換成一系列 redis 的操作指令,序列化到乙個新的 aof 日誌檔案中。序列化完畢後再將操作期間發生的增量 aof 日誌追加到這個新的 aof 日誌檔案中,追加完畢後就立即替代舊的 aof 日誌檔案了,**工作就完成了
7、aof 日誌是以檔案的形式存在的,當程式對 aof 日誌檔案進行寫操作時,實際上是將內容寫到了核心為檔案描述符分配的乙個記憶體快取中,然後核心會非同步將髒資料刷回到磁碟的。
8、linux 的glibc提供了fsync(int fd)函式可以將指定檔案的內容強制從核心快取刷到磁碟
9、檔案 io 操作是不能使用多路復用 api的的原因:常規的檔案io操作(讀寫)是不會阻塞的,不管讀多少位元組,read一定會在有限的時間內返回。從終端裝置或網路讀則不一定。同樣,寫常規檔案是不會阻塞的,而向終端裝置或網路寫則不一定
redis持久化 AOF持久化
1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...
redis持久化之AOF持久化
aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...
Redis的持久化 AOF
redis的aof持久化策略是將傳送到redis服務端的每一條命令都記錄下來,並且儲存到硬碟中的aof檔案中,類似打日誌檔案,來一條命令就記錄一條。aof設定 aof測試 當客戶端向伺服器傳送一些redis命令時,redis會將所執行的命令記錄到aof檔案中,如下所示 當redis伺服器重啟後,會將...