Redis基礎:持久化

Blog:博客園 我的數據庫

什麼是持久化?簡單來說就是將數據放到斷電後數據不會丟失的設備中,也就是咱們一般理解的硬盤上。緩存

首先咱們來看一下數據庫在進行寫操做時到底作了哪些事,主要有下面五個過程:安全

  • 客戶端向服務端發送寫操做(數據在客戶端的內存中);
  • 數據庫服務端接收到寫請求的數據(數據在服務端的內存中);
  • 服務端調用write這個系統調用,將數據往磁盤上寫(數據在系統內存的緩衝區中);
  • 操做系統將緩衝區中的數據轉移到磁盤控制器上(數據在磁盤緩存中);
  • 磁盤控制器將數據寫到磁盤的物理介質中(數據真正落到磁盤上);

Redis持久化方式分爲RDBAOFbash

RDB持久化

RDB(Redis DataBase)持久化是在指定的時間間隔內將內存中的數據集快照寫入磁盤。同時也是默認的持久化方式。服務器

img

工做流程

1

配置

觸發方式
save m n # 表示m秒內數據集存在n次修改時,自動觸發bgsave

例如,如下能夠同時配置:app

# 900秒內執行1次更新 
save 900 1 
# 300秒內執行10次更新 
save 300 10 
# 60秒內執行10000次更新 
save 60 10000
rdb文件存放目錄
# 指定本地數據庫文件名,通常採用默認的dump.rdb 
dbfilename dump.rdb 
# 備份文件存放目錄,通常也用默認配置 
dir ./
開啓數據壓縮

配置存儲至本地數據庫時是否壓縮數據,默認爲yes。Redis採用LZF壓縮方式,但佔用了一點CPU的時間。若關閉該選項,但會致使數據庫文件變的巨大。建議開啓。性能

rdbcompression yes

AOF持久化

AOF(Append only file)持久化是以獨立日誌的方式記錄每次命令,重啓時再從新執行AOF文件中的命令達到恢復數據的目的。操作系統

AOF的主要做用是解決了數據持久化的實時性線程

AOF直接採用文本協議格式(兼容性好),開啓AOF後,全部寫入命令都包含追加操做,直接採用文本協議格式,避免了二次處理開銷。3d

工做流程

AOF的工做流程操做:命令寫入(append)、文件同步(sync)、文件重寫(rewrite)、重啓加載(load)。

12155333

流程以下:

  1. 全部的寫入命令會追加到aof_buf(緩衝區)中;
  2. AOF緩衝區根據對應的策略向硬盤作同步操做;
  3. 隨着AOF文件愈來愈大, 須要按期對AOF文件進行重寫, 達到壓縮的目的;
  4. 當Redis服務器重啓時, 能夠加載AOF文件進行數據恢復;

開啓AOF

默認不開啓,啓用AOF持久化方式

appendonly yes 
# AOF文件名稱 
appendfilename "appendonly.aof" 
# 備份文件存放路徑,同RDB 
dir ./ 
# 同步頻率 
appendfsync everysec

appendfsync同步頻率配置參考:

  • always:命令寫入aof_buf後調用fsync操做同步到AOF文件,fsync完成後線程返回,每一個 Redis 命令都要同步寫入硬盤,這樣會嚴重下降 Redis 的性能。
  • everysec:命令寫入aof_buf後調用系統write操做,write完成後線程返回。fsync同步文件操做由專門線程每秒調用一次。每秒執行一次同步,顯式地將多個寫命令同步到硬盤。
  • no:命令寫入aof_buf後調用系統write操做,不對AOF文件作fsync同步,同步硬盤操做由操做系統負責,一般週期周長30秒。操做系統同步AOF文件的週期不可控,會加大每次同步硬盤的數據量,數據安全性沒法保證。

重寫機制

隨着命令不斷寫入AOF,文件會愈來愈大,爲了解決這個問題,Redis引入AOF重寫機制壓縮文件體積。AOF文件重寫是把Redis進程內的數據轉化爲寫命令同步到新AOF文件的過程。

重寫後的AOF文件爲何能夠變小?有以下緣由:

  • 進程內已經超時的數據再也不寫入文件。
  • 舊的AOF文件含有無效命令,如del key1hdel key2srem keysset a1111set a222等。重寫使用進程內數據直接生成,這樣新的AOF文件只保留最終的數據寫入命令。
  • 多條寫命令能夠合併爲一個,如:lpuh list alpush list blpush list c能夠轉化爲:lpush list a b c。爲了防止單條命令過大形成客戶端緩衝區溢出,對於listsethashzset等類型操做,以64個元素爲界拆分爲多條。

AOF重寫不只下降了文件佔用空間,並且更小的AOF文件能夠更快地被Redis加載。

觸發方式:

  • 手動觸發:直接調用bgrewriteaof命令;
  • 自動觸發:根據auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數肯定自動觸發時機;
auto-aof-rewrite-min-size:表示運行AOF重寫時文件最小體積,默認爲64MB。

auto-aof-rewrite-percentage:表明當前AOF文件空間(aof_current_size)和上一次重寫後AOF文件空間(aof_base_size)的比值。

自動觸發時機=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size) /aof_base_size>=auto-aof-rewritepercentage

1515sd2

流程說明:

  • AOF持久化開啓且存在AOF文件時, 優先加載AOF文件, 打印以下

日誌:

* DB loaded from append only file: 5.841 seconds
  • AOF關閉或者AOF文件不存在時, 加載RDB文件, 打印以下日誌:
* DB loaded from disk: 5.586 seconds
  • 加載AOF/RDB文件成功後, Redis啓動成功。
  • AOF/RDB文件存在錯誤時, Redis啓動失敗並打印錯誤信息。

RDB-AOF混合持久化

因爲RDB持久化和AOF持久化都有各自的優缺點,所以在很長一段時間裏,如何選擇合適的持久化方式成了不少Redis用戶面臨的一個難題。爲了解決這個問題,Redis從4.0版本開始引入RDB-AOF混合持久化模式,這種模式是基於AOF持久化模式構建而來的。

相關文章
相關標籤/搜索