1.Redis 儲存機制
Redis儲存機制分成兩種Snapshot 和 AOF。無論是那種機制,Redis都是將資料存放區在記憶體中。
Snapshot工作原理: 是將資料先儲存在記憶體,然後當資料累計達到某些設定的伐值的時候,就會觸發一次DUMP操作,將變化的資料一次性寫入資料檔案(RDB檔案)。
AOF 工作原理: 是將資料也是先存在記憶體,但是在儲存的時候會使用調用fsync來完成對本次寫操作的日誌記錄,這個日誌揭露檔案其實是一個基於Redis網路互動協議的文字檔。AOF調用fsync也不是說全部都是無阻塞的,在某些系統上可能出現fsync阻塞進程的情況,對於這種情況可以通過配置修改,但預設情況不要修改。AOF最關鍵的配置就是關於調用fsync追加記錄檔的平率,有兩種預設頻率,always每次記錄進來都添加,everysecond 每秒添加一次。兩個配置各有所長後面分析。由於是採用日誌追加的方式來持久話資料,所以引出了第二個日誌的概念:rewrite. 後面介紹它的由來。
儲存模式效能和安全比較:
1.效能:Snapshot方式的效能是要明顯高於AOF方式的,原因有兩點:
- 採用2進位方式儲存資料,資料檔案比較小,載入快速.
- 儲存的時候是按照配置中的save策略來儲存,每次都是彙總很多資料批量儲存,寫入的效率很好,而AOF則一般都是工作在即時儲存或者准即時模式下。相對來說儲存的頻率高,效率卻偏低。
2.資料安全:AOL資料安全性高於Snapshot儲存,原因:
- Snapshot儲存是基於累計批量的思想,也就是說在允許的情況下,累計的資料越多那麼寫入效率也就越高,但資料的累計是靠時間的積累完成的,那麼如果在長時間資料不寫入RDB,但Redis又遇到了崩潰,那麼沒有寫入的資料就無法恢複了,但是AOF方式偏偏相反,根據AOF配置的儲存頻率的策略可以做到最少的資料丟失和較高的資料恢複能力。
說完了效能和安全,這裡不得不提的就是在Redis中的Rewrite的功能,AOF的儲存是按照記錄日誌的方式去工作的,那麼成千上萬的資料插入必然導致記錄檔的擴大,Redis這個時候會根據配置合理觸發Rewrite操作,所謂Rewrite就是將記錄檔中的所有資料都重新寫到另外一個新的記錄檔中,但是不同的是,對於老記錄檔中對於Key的多次操作,只保留最終的值的那次操作記錄到記錄檔中,從而縮小記錄檔的大小。這裡有兩個配置需要注意:
auto-aof-rewrite-percentage 100 (當前寫入記錄檔的大小佔到初始記錄檔大小的某個百分比時觸發Rewrite)
auto-aof-rewrite-min-size 64mb (本次Rewrite最小的寫入資料良)
兩個條件需要同時滿足。