首頁  >  文章  >  資料庫  >  Redis持久化機制的範例分析

Redis持久化機制的範例分析

王林
王林轉載
2023-06-01 22:30:071404瀏覽

Redis把資料儲存在記憶體中,當進程退出後資料就會遺失。透過Redis的持久化機制,記憶體中的資料可以儲存在磁碟上,在重新啟動後可以從磁碟檔案載入資料以重新填充記憶體。

Redis支援兩種持久化機制:全量鏡像RDB和增量式持久化AOF。

RDB是Redis的快照,儲存了Redis中所有未過期的鍵值對。

redis.conf中設定RDB:

dbfilename dump.rdb
dir /var/lib/redis



save 900 1 save 300 10 save 60 10000 save "" stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes

每次redis進程啟動時會先檢查rdb檔案是否存在,若存在則將檔案中的內容載入到內存中。

redis自動更新RDB檔案時會fork一個子程序執行快照保存工作,在儲存期間主程序可以正常的提供服務。

我們同樣可以透過指令儲存快照:

  • save: 以阻塞的方式儲存快照,儲存期間redis不能處理其它請求

  • bgsave: fork一個子程序完成儲存工作,儲存期間不會影響redis的正常服務。

lastsave指令可以得到最新的RDB檔案建立時間戳,可以用來檢查儲存是否成功。

RDB作為資料庫快照,每次建立都需要將整個資料庫寫入到檔案中。這是一個非常耗時的操作,因此也難以頻繁進行,在出現異常時可能會遺失大量資料。

Redis提供了增量式持久化工具AOF(Append Only ile), AOF透過記錄Redis資料庫中所有寫入指令進行持久化。 AOF檔案中以Redis通訊協定的格式儲存指令。

當Redis程序啟動時會檢查AOF檔是否存在,若存在則依序執行AOF中的指令恢復資料。

Redis每次執行寫入指令時都會在AOF檔案中新增一條日誌,但新的記錄不會立即寫入磁碟(fsync)而是快取在寫入緩衝區中。

我們可以設定將緩衝區中的資料寫入磁碟的策略,避免資料遺失。

將緩衝區中資料寫入磁碟是一個耗時操作,頻繁寫入磁碟會對效能造成影響但是Redis崩潰遺失資料也較少,因此我們需要根據應用程式場景進行權衡。

AOF中可能會記錄多餘的指令,若我們對同一個key執行了100次set指令, AOF檔中就會有100筆記錄但隻隻保留最後一條set指令即可恢復資料。 AOF重寫會整理AOF檔案清理不必要的指令日誌(如刪除被覆蓋的set指令),減少AOF檔案大小。

redis 採用後台重寫的策略,也就是 fork 一個子程序把整理後的 AOF 寫入到暫存檔案中。使用BGREWRITEAOF可以手動觸發背景重寫操作。

其實AOF重寫不會讀取原來的AOF文件,子程序會帶有一份目前資料的副本,並根據該副本直接產生新的AOF檔。

主程式在重寫期間將新增的寫入操作寫入原始的 AOF檔案 和 AOF重寫快取 中,即使重寫失敗原來的AOF檔案仍保存了完整的資料。當子進程完成AOF重寫後會向主進程發送訊號,主進程收到該訊號後會將AOF重寫快取中的內容寫入新的AOF文件,然後用新的AOF檔案覆蓋原有檔案。

redis.conf中設定AOF:

appendonly yes  
  

appendfilename appendonly.aof  
  


appendfsync everysec 

    no-appendfsync-on-rewrite no   
  


auto-aof-rewrite-percentage 100  
  

auto-aof-rewrite-min-size 64mb

Redis會記錄啟動時或上次重寫後AOF檔的大小,若新增資料的大小達到原大小的100%(auto-aof-rewrite-percentage配置)則觸發重寫。

只有當前AOF檔案體積大於auto-aof-rewrite-min-size時才會執行重寫操作,否則即使新增資料量超過指定百分比也不會執行重寫。這樣避免了原文件過小導致初期頻繁重寫的問題。

以上是Redis持久化機制的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除