Redis持久化的兩種方式

  • 2019 年 10 月 6 日
  • 筆記

前言 

  Redis 是內存數據庫,如果不將內存中的數據保存到磁盤,進程退出的時候內存中的數據也會被清除。為了解決該問題,Redis 持久化有兩種方式,分別是RDB和AOF。下面會比較詳細介紹這兩種持久化方式。

RDB方式

  RDB持久化既可以手動執行,也可以根據服務器配置選項定期執行,該功能就是把某個時間點的內存數據狀態保存到一個經過壓縮的二進制文件(即 RDB文件)中。

  1、配置選項執行 

    在redis.conf文件中配置如下:

只要滿足以下三個條件中的任何一個就會觸發持久化操作:

    1. 服務器900秒之內,對數據庫進行至少1次修改
    2. 服務器300秒之內,對數據庫進行至少10次修改
    3. 服務器60秒之內,對數據庫進行至少10000次修改

  2、手動執行

  手動執行,可以在客戶端中直接運行save、bgsave、bgrewriteaof命令觸發持久化操作。save命令執行是同步操作,Redis服務器會被阻塞, 所以客戶端請求會被阻塞;bgsave命令執行是異步操作,會創建一個子進程來完成RDB持久化操作,所以當用bgsave創建RDB文件的過程,服務器仍然可以處理客戶端的請求;bgrewriteaof命令跟bgsave差不多。

  3、RDB小結

  RDB方式持久化是在某個時間點把內存中key-value數據同步到RDB文件中。

AOF方式

  AOF 持久化是通過把Redis 服務器所執行的寫命令追加到AOF文件的方式來實現的。AOF持久化功能的實現分為命令追加、文件寫入和文件同步三步驟。

  1、開啟AOF

  在redis.conf文件中配置如下:

appendonly yes    appendfilename "appendonly.aof"

  默認是no關閉狀態。

  2、命令追加

  服務器在執行完一個寫命令之後,會以協議格式將被執行的寫命令追加到服務器狀態的aof_buf緩存區的末尾。 

3、文件寫入

服務器會調用flushAppendOnlyFile函數,並根據服務器配置的appendfsync選項的值類決定是否把aof_buf緩存區的數據寫入保存到AOF文件中。

appendfsync 選項的值

flushAppendOnlyFile 函數行為

always

將aof_buf緩衝區中的所有內容寫入並同步到AOF文件

everysec

將aof_buf緩衝區中的所有內容寫入到AOF文件,如果上次同步AOF 文件的時間距離現在超過一秒鐘, 那麼再次對AOF文件進行同步,並且這個同步操作是用一個線程專門負責執行的

no

將aof_buf緩衝區中的所有內容寫入到AOF文件,但不對AOF文件進行同步,何時同步由操作系統來決定

默認值是 everysec。

4、文件同步

  為了提高文件的寫入效率,現在操作系統中,當用戶調用write函數,將一些數據寫入到文件的時候,操作系統通常會將寫入的數據暫時保存咋一個內存緩衝區裏面,等到緩衝區的空間唄填滿、或者超過指定的閥值後,才真正的將緩衝區中的數據寫入到磁盤中。