Redis的持久化

 

Redis的持久化

定義

Redis的強勁性能很大程度上是由於其將所有數據都存儲在內存中,爲了使Redis在重啓之後仍能保證數據的不丟失,需要將數據以某種形式保存到硬盤中,這一過程就是持久化。

持久化方式

Redis支持兩種持久化方式,一種是RDB方式,一種是AOF方式。可以使用一種或將二者結合使用。

RDB方式

定義

RDB方式的持久化是通過快照(snapshotting)完成,當符合一定條件時,Redis會自動將內存中所有的數據進行快照並保存到硬盤上。保存快照的條件由用戶在配置文件中定義。由兩個參數構成:時間和改動的鍵的個數。當在指定的時間內被改動的鍵個數大於設置的鍵個數時就進行快照。

配置

配置文件中有三個默認的設置

save 900 1

save 300 10

save 60 10000

save 900 1 意思是900秒鐘內,鍵的改動個數大於1就進行快照。

路徑

Redis默認將快照文件存儲在當前目錄dump.rdb文件中,可以通過dir和dbfilename兩個參數分別指定快照的存儲路徑和文件名。

方式

  1. 自動快照
  2. 手動快照

手動快照是手動發送SAVE或這BGSAVE命令讓Redis執行快照,量命令區別在於,前者是由主進程進行快照操作,會阻塞住其他請求,後者會通過fork子進程進行快照操作。

過程

  1. Redis使用fork函數複製一份當前進程(父進程)的副本(子進程);
  2. 父進程繼續接收並處理客戶端發過來的命令,而子進程開始將內存中的數據寫入硬盤的臨時文件;
  3. 當子進程寫完所有的數據後會將臨時文件替換舊的RDB文件。

 

AOF方式

定義

默認情況下Redis沒有開啓AOF(append only file)方式的持久化,可以通過appendonly參數開啓

appendonly yes

開啓AOF持久化後每執行一條會更改Redis中的數據的命令,Redis就會將該命令寫入硬盤中的AOF文件。AOF文件的保存位置和RDB文件位置相同,都是通過dir參數設置,默認文件名appendonly.aof,可以通過參數appendfilename參數修改:

appendfilename appendonly.aof

命令寫入格式

假設在AOF持久化的情況下執行了如下4個命令

SET foo 1

SET foo 2

SET foo 3

GET foo

Redis會前1條命令寫入AOF文件,此時AOF文件中內容如下:

*2

$6

SELECT

$1

0

*3

$3

SET

$3

foo

$1

1

*3

$3

SET

$3

foo

$1

2

*3

$3

SET

$3

foo

$1

3

解析

*2表示接下來會寫入兩個指令

$6表示當前寫入指令爲6個字符,即SELECT

$1表示當前寫入指令爲1個字符,即 0

 

*3表示接下來會寫入兩個指令

$3表示當前寫入指令爲3個字符,即SET

$3表示當前寫入指令爲3個字符,即 foo

$1表示當前寫入指令爲1個字符,即1

AOF文件重寫

每當達到AOF文件達到一定條件時,AOF文件就會自動重寫,重寫會對指令進行優化,刪除冗餘的命令。

比如上文的命令重寫之後保存到AOF文件如下

*2

$6

SELECT

$1

0

*3

$3

SET

$3

foo

$1

3

我們發現前2、3兩個冗餘指令都被刪除了

配置文件設置

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

auto-aof-rewrite-percentage表示當前AOF文件大小超過上一次重寫時AOF文件大小的百分之多少時就會再次進行重寫,如果之前沒有重寫過,則以啓動時的AOF文件大小爲依據。

auto-aof-rewrite-min-size參數限制了運行重寫的最小AOF文件的大小,通常在AOF文件很小的情況下即使其中由冗餘的命令我們也不會太關心。

除了Redis自動重寫外,我們可以使用BGREWRITEAOF命令手動執行AOF重寫。

重寫的過程只和內存中的數據有關,和之前的AOF文件無關,這與RDB很相似,只不過二者的文件格式完全不同。

在啓動時,Redsi會逐個執行AOF文件中的命令來將硬盤中的數據載入到內存中,載入的速度相較於RDB會慢一些。

AOF文件的同步

雖然每次執行更改數據庫內容的操作時,AOF都會將命令記錄在AOF文件中,但是事實上,由於操作系統的緩存機制,數據並沒有真正寫入磁盤,而是進入系統的硬盤緩存。默認情況下系統每30秒會執行一次同步操作,以便硬盤緩存中的內容真正地寫入硬盤,在這30秒的過程中如果系統異常則會導致硬盤緩存中的數據丟失。一般來講啓用AOF文件持久化的應用都無法容忍這樣的損失,這就需要Redis在寫入AOF文件後要求系統將緩存同步到硬盤中。

在Redis中,通過參數appendfsync參數設置同步時機

#appendfsync always

appendfsync everysec

#appendfsync no

默認情況Redis採用everysec規則,即每秒執行一次同步操作。一般情況下,使用everysec就足夠了,兼顧了性能又保證了一定的安全。

Always表示每次執行寫入都會執行同步,這是最安全也是最慢的方式

No表示不主動進行同步操作,而是完全交予操作系統來做(30秒一次),這是最快也是最不安全的方式。

Redis允許同時開始AOF與RDB,即保證了數據安全又使得進行備份操作十分容易。此時重啓Redis後會是使用AOF文件來恢復數據,因爲AOF方式的持久化可能丟失的數據更少。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章