redis持久化 、 RDB 快照存儲、 AOF 只追加文件

[TOC]

持久化 、 RDB 快照存儲、 AOF 只追加文件

  • redis可以將數(shù)據(jù)寫入到磁盤中,在停機或宕機后,再次啟動redis時,將磁盤中的備份數(shù)據(jù)加載到內(nèi)存中恢復使用。這是redis的持久化。持久化有如下兩種機制。

RDB 快照存儲

  • redis可以將內(nèi)存中的數(shù)據(jù)寫入磁盤進行持久化。在進行持久化時,redis會創(chuàng)建子進程來執(zhí)行。

  • redis默認開啟了快照持久化機制。

  • 機制:

    1. fork出一個子進程,專門進行數(shù)據(jù)持久化, 將內(nèi)存中所有數(shù)據(jù)保存到單個rdb文件中(默認為dump.rdb)
    2. redis重啟后, 會加載rdb文件中的數(shù)據(jù)到內(nèi)存中
  • 觸發(fā)方式

    • 配置中設(shè)置自動持久化策略
    • SAVE | BGSAVE | SHUTDOWN (前提是設(shè)置了自動持久化策略)
    • BGSAVE:執(zhí)行BGSAVE命令,手動觸發(fā)RDB持久化
    • SHUTDOWN:關(guān)閉redis時觸發(fā)
  • 相關(guān)配置

      save 60 1000  # 多久執(zhí)行一次自動快照操作 60秒內(nèi)如果更新了1000次, 則持久化一次
      stop-writes-on-bgsave-error no  # 創(chuàng)建快照失敗后,是否繼續(xù)執(zhí)行寫命令
      rdbcompression yes  # 是否對快照文件進行壓縮
      dbfilename dump.rdb  # 如何命名快照文件
      dir ./ # 快照文件保存的位置
    
      save   # 關(guān)閉RDB機制
    
  • 優(yōu)點:

    1. 方便數(shù)據(jù)備份: 由于保存到單獨的文件`中, 易于數(shù)據(jù)備份 (可以使用定時任務(wù), 定時將文件發(fā)送給數(shù)據(jù)備份中心)
    2. 寫時復制`: 子進程單獨完成持久化操作, 父進程不參與IO操作, 最大化redis性能
    3. 恢復大量數(shù)據(jù)時, 速度優(yōu)于 AOF
  • 缺點:

    1. 不是實時保存數(shù)據(jù)`, 如果redis意外停止工作(如電源斷電等), 則可能會丟失一段時間的數(shù)據(jù)
    2. 數(shù)據(jù)量大時, fork進程會比較慢, 持久化時使redis響應(yīng)速度變慢

AOF 只追加文件

  • redis可以將執(zhí)行的所有指令追加記錄到文件中持久化存儲,這是redis的另一種持久化機制。

  • redis默認未開啟AOF機制。

  • Append-only file 只追加文件

    1. 只追加而 不是全部重新寫入
    2. 追加命令, 而不是數(shù)據(jù)
  • 機制

    1. 主線程將 寫命令 追加到aof_buf(緩沖區(qū))中, 根據(jù)使用的策略不同, 子線程 將緩存區(qū)的命令寫入到aof文件中 (不使用子進程)
    2. 當redis重啟時, 會重新執(zhí)行aof文件中的命令來恢復數(shù)據(jù)
    3. 如果同時開啟了 RDB, 則優(yōu)先使用 AOF
  • 文件修復

    1. 如果AOF出錯 (磁盤滿了/寫入中途宕機等), 則redis重啟時會拒絕使用該AOF文件

    2. 修復步驟

      1. 首先備份AOF文件
      2. 使用redis-check-aof工具進行修復 (一般會刪除末尾無法恢復的命令)
      3. 重啟redis服務(wù)器, 自動載入修復后的AOF文件, 進行數(shù)據(jù)恢復
  • 文件重寫/壓縮

    • AOF 提供了重寫/壓縮機制(優(yōu)化命令), 以避免AOF文件過大
    • fork子進程來完成 AOF 重寫
  • 相關(guān)配置

    appendonly no  # 是否開啟AOF機制
    appendfsync everysec  # 多久將寫入的內(nèi)容同步到硬盤 每秒一次
    no-appendfsync-on-rewirete no  # 重寫aof文件時是否執(zhí)行同步操作
    auto-aof-rewrite-percentage 100  # 多久執(zhí)行一次aof重寫, 當aof文件的體積比上一次重寫后的aof文件大了一倍時
    auto-aof-rewrite-min-size 64mb  # 多久執(zhí)行一次aof重寫,當aof文件體積大于64mb時
    
    appendfilename appendonly.aof  # aof文件名
    dir ./  # aof文件保存的位置(和rdb文件共享該配置)
    
    
    AOF機制記錄操作的時機
    # appendfsync always  # 每個操作都寫到磁盤中
    appendfsync everysec  # 每秒寫一次磁盤,默認
    # appendfsync no  # 由操作系統(tǒng)決定寫入磁盤的時機
    
  • 優(yōu)點

    1. 更可靠` 默認每秒同步一次操作, 最多丟失一秒數(shù)據(jù)
      • 提供了三種策略, 還可以不同步/每次寫同步
    2. 可以進行文件重寫, 以避免AOF文件過大
  • 缺點:

    1. 相同數(shù)據(jù)集, AOF文件比RDB體積大, 恢復速度慢
    2. 除非是不同步情況, 否則普遍要比RDB `速度慢

如何選擇持久化

  • 對于更新頻繁, 一致性要求不是非常高的數(shù)據(jù) 可以選擇使用redis進行持久化存儲

  • RDB or AOF

    • 數(shù)據(jù)安全性要求高, 都打開
    • 可以接受短時間的數(shù)據(jù)丟失, 只使用 RDB
    • 即使使用 AOF, 最好也開啟 RDB, 因為便于備份并且回復速度快, bug更少
  • 項目中的應(yīng)用

    • 使用redis進行一部分數(shù)據(jù)的持久化存儲

      • 用戶的閱讀歷史/搜索歷史
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Redis高可用概述 在介紹Redis高可用之前,先說明一下在Redis的語境中高可用的含義。 我們知道,在w...
    空語閱讀 1,679評論 0 2
  • 轉(zhuǎn)載 Redis 是一個開源( BSD 許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件. ...
    大先生居然都有人用了閱讀 1,475評論 0 0
  • 企業(yè)級redis集群架構(gòu)的特點 海量數(shù)據(jù) 高并發(fā) 高可用 要達到高可用,持久化是不可減少的,持久化主要是做災(zāi)難恢復...
    lucode閱讀 2,280評論 0 7
  • 不知道你今天和誰去玩了,但你應(yīng)該很開心,什么時候能和你過七夕呢,幻想過好多次了,可能也只是幻想吧,min
    阿拉斯加2閱讀 196評論 0 0
  • 已經(jīng)凌晨一點二十分。洗完澡,裹上一條厚實的紅毯子。打開一瓶啤酒,點上一根煙。窩在椅子里,敲打著鍵盤。很久沒有這種純...
    綠蟻新焙酒閱讀 480評論 0 1

友情鏈接更多精彩內(nèi)容