redis筆記-資料庫之持久化策略

來源:互聯網
上載者:User

標籤:proc   一個   不能   重寫原理   ext   images   write   添加   file   

2018-1-17 by Atlas

  • redis持久化

將redis在記憶體中的資料庫狀態保持到磁碟裡面,避免資料意外丟失。

  • RDB持久化
  • 既可以手動執行,也可以根據伺服器配置選項定期執行。
  • 產生的RDB檔案是一個經過壓縮的二進位檔案,通過該檔案可以還原產生RDB檔案時的資料庫狀態。
  • RDB檔案載入時,伺服器一直處於阻塞狀態,直到完成。

  • 命令SAVE、BGSAVE
    SAVE命令會阻塞redis伺服器處理序,直到RDB檔案建立完畢為止,在伺服器處理序阻塞期間,伺服器不能處理任何命令請求。
    BGSAVE命令會派生出一個子進程,然後由子進程負責建立RDB檔案,伺服器處理序(父進程)繼續處理命令請求。

  • AOF檔案更新頻率通常比RDB檔案更新頻率高。
    so -->
    如果開啟AOF,伺服器優先使用AOF檔案還原資料庫;
    只有AOF關閉,伺服器才會使用RDB檔案還原資料庫。

  • BGSAVE命令執行時的伺服器狀態:
    (1)BGSAVE執行期間,用戶端發送的SAVE命令會被伺服器拒絕。
    (2)BGSAVE執行期間,用戶端發送的BGSAVE命令會被伺服器拒絕。
    (3)BGSAVE和BGREWRITEAOF不能同時執行:
    如果BGSAVE正在執行,那麼用戶端發送的BGREWRITEAOF會被延遲到BGSAVE後執行;
    如果BGREWRITEAOF正在執行,那麼用戶端發送的BGSAVE會被伺服器拒絕。

  • SAVE儲存條件
save  900  1                          伺服器在900秒之內,對資料庫進行了至少1次修改save  300  10                        伺服器在300秒之內,對資料庫進行了至少10次修改save  60    10000                  伺服器在60秒之內,對資料庫進行了至少10000次修改
struct redisServer {        // ...        // 記錄儲存條件的數組        struct saveparam *saveparams;        // 修改計數器        long long dirty;        // 上次執行儲存的時間        time_t lastsave;        // ...}struct saveparam {        // 秒數        time_t seconds;        // 修改數        int changes;}

ServerCron 函數檢查儲存條件的過程

RDB檔案結構將和JAVA CLASS檔案一同討論。

  • AOF持久化
  • AOF持久化是通過儲存redis伺服器所執行的 寫命令 來記錄資料庫狀態的。

  • AOF檔案內容是純文字格式。
    e.g.
    redis> SET msg "hello"
    ok
    AOF檔案內容(SELECT命令是伺服器自動添加的):
    2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n
    3\r\n$3\r\n$3\r\nSET\r\n$3\r\nmsg\r\n$5\r\nhello\r\n

  • AOF持久化實現步驟:
    命令追加 --> 檔案寫入 --> 檔案同步
  • 命令追加是將執行的寫命令追加到伺服器狀態的aof_buf緩衝區的末尾:
struct redisServer {        // ...        // AOF緩衝區        sds aof_buf;        // ...}
  • 檔案的寫入與同步
    flushAppendOnlyFile()函數考慮是否要將aof_buf中的內容寫入和儲存到AOF檔案裡面,行為由伺服器配置的appendfsync選項的值來決定。
  • appendfsync配置:

always:AOF持久化效率最慢,安全性來說最安全,故障只會丟失一個命令資料。
everysec:AOF持久化效率足夠快,安全性來說,故障只會丟失一秒鐘的命令資料。
no:AOF持久化效率最快,安全性來說,故障會丟失上次同步AOF檔案之後的所有寫命令資料。

  • AOF 檔案載入過程

  • AOF檔案重寫,解決AOF檔案體積膨脹問題。
  • AOF檔案重寫原理:
    AOF檔案重寫並不需要對現有的AOF檔案進行讀取、分析或者寫入操作,而是通過讀伺服器當前的資料庫狀態來實現的。
    AOF檔案重寫首先從資料庫中讀取鍵現在的值,然後用一條命令記錄索引值對,代替之前記錄這個鍵的多條命令。
    如果元素數量超過redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量的值,那麼重寫多條命令記錄鍵的值。
  • AOF檔案後台重寫過程(BGREWRITEAOF原理)

參考文獻:《redis設計與實現》

redis筆記-資料庫之持久化策略

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.