首頁  >  文章  >  資料庫  >  聊聊Redis的持久化機制,到底採用RDB還是AOF呢?

聊聊Redis的持久化機制,到底採用RDB還是AOF呢?

青灯夜游
青灯夜游轉載
2021-11-25 19:23:222142瀏覽

這篇文章帶大家了解Redis的持久化機制(RDB和AOF),聊聊到底採用RDB還是AOF呢?希望對大家有幫助!

聊聊Redis的持久化機制,到底採用RDB還是AOF呢?

RDB

1. 什麼是RDB

RDB:每隔一段時間,把記憶體中的資料寫入磁碟的臨時文件,作為快照,恢復的時候把快照文件讀進記憶體。如果宕機重啟,那麼記憶體裡的資料肯定會沒有的,那麼再次啟動redis後,則會恢復。 【相關建議:Redis影片教學

2.備份與復原

##記憶體備份--> 磁碟暫存檔案

臨時檔案--> 恢復到記憶體

3. RDB優劣勢

    優勢
    • ##每隔一段時間備份,全量備份
    • 災備簡單,可以遠端傳輸
    • 子程序備份的時候,主程序不會有任何io操作(不會有寫入修改或刪除),保證備份資料的的完整性
    • 相對AOF來說,當有更大檔案的時候可以快速重啟恢復
    #劣勢
    • 發生故障是,有可能會遺失最後一次的備份資料
    • 子程序所佔用的記憶體比會和父行程一模一樣,如會造成CPU負擔
    • 由於定時全量備份是重量級操作,所以對於即時備份,就無法處理了。
4. RDB的設定

    #儲存位置,可以在redis.conf自定義:
  • /user/local/redis/working/dump.rdb


  • #儲存機制:
  • ##

    save 900 1
    save 300 10
    save 60 10000
    save 10 3
    * 如果1个缓存更新,则15分钟后备份
    * 如果10个缓存更新,则5分钟后备份
    * 如果10000个缓存更新,则1分钟后备份

#stop-writes-on-bgsave-error
  • yes:如果save程序出錯,則停止寫入操作

      no:可能造成資料不一致
    #rdbcompression
  • yes:開啟rdb壓縮模式

      no:關閉,會節省cpu損耗,但是檔案會大,道理同nginx
    rdbchecksum
  • yes:使用CRC64演算法校驗對rdb進行資料校驗,有10%效能損耗

      no:不校驗
  • 總結

#RDB適合大量資料的恢復,但是資料的完整性和一致性可能會不足。

AOF

AOF特徵

#以日誌的形式記錄使用者要求的寫入操作。讀取操作不會記錄,因為寫入操作才會儲存。
  • 檔案以追加的形式而不是修改的形式。
  • redis的aof恢復其實就是把追加的檔案從開始到結尾讀取執行寫入操作。
  • 優勢

AOF更耐用,可以以秒位為單位備份,如果發生問題,也只會遺失最後一秒的數據,大大增加了可靠性和數據完整性。所以AOF可以每秒備份一次,使用fsync操作。
  • 以log日誌形式追加,如果磁碟滿了,會執行redis-check-aof 工具
  • 當資料太大的時候, redis可以在背景自動重寫aof。當redis繼續把日誌追加到舊的檔案中去時,重寫也是非常安全的,不會影響客戶端的讀寫操作。
  • AOF 日誌包含的所有寫入操作,會更方便redis的解析復原。
  • 缺點

#相同的數據,同一份數據,AOF比RDB大
  • 針對不同的同步機制,AOF會比RDB慢,因為AOF每秒都會備份做寫操作,這樣相對與RDB來說就略低。每秒備份fsync沒毛病,但如果客戶端的每次寫入就做一次備份fsync的話,那麼redis的效能就會下降。
  • AOF發生過bug,就是資料復原的時候資料不完整,這樣看起來AOF會比較脆弱,容易出現bug,因為AOF沒有RDB那麼簡單,但呢為了防止bug的產生,AOF就不會根據舊的指令去重構,而是根據當時快取中存在的資料指令去做重構,這樣就更加健壯可靠了。
  • AOF的設定

`# AOF 默认关闭,yes可以开启
appendonly no

# AOF 的文件名
appendfilename "appendonly.aof"

# no:不同步
# everysec:每秒备份,推荐使用
# always:每次操作都会备份,安全并且数据完整,但是慢性能差
appendfsync everysec

# 重写的时候是否要同步,no可以保证数据安全
no-appendfsync-on-rewrite no

# 重写机制:避免文件越来越大,自动优化压缩指令,会fork一个新的进程去完成重写动作,新进程里的内存数据会被重写,此时旧的aof文件不会被读取使用,类似rdb
# 当前AOF文件的大小是上次AOF大小的100% 并且文件体积达到64m,满足两者则触发重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb`
到底採用RDB還是AOF呢?

如果你能接受一段時間的快取遺失,那麼可以使用RDB
  • 如果你對即時性的資料比較care ,那就用AOF
  • 使用RDB和AOF結合一起做持久化,RDB做冷備,可以在不同時期對不同版本做恢復,AOF做熱備,保證資料只有1秒的損失。當AOF破損不可用了,那麼再用RDB恢復,這樣就做到了兩者的相互結合,也就是說Redis恢復會先加載AOF,如果AOF有問題會再加載RDB,這樣就達到冷熱備份的目的了。

更多程式相關知識,請造訪:程式設計入門! !

以上是聊聊Redis的持久化機制,到底採用RDB還是AOF呢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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