1. 程式人生 > >Redis中兩種持久化方式

Redis中兩種持久化方式

目錄

1.Redis的持久化:

2.Redis中持久化方式:

 2.1 快照持久化

2.2 AOF持久化

2.3 快照持久化和AOF持久化的差別:

2.4手動發起快照持久化:

3.如何設定兩種持久化方式的相關資訊?

 4.檢視並分析dump.rdb和appendonly.aof檔案內容:

5.總結:


1.Redis的持久化:

Redis具有持久化功能,其支援邊執行邊將記憶體中的資料備份到硬碟中,這樣子的好處就在於:當Redis執行時伺服器突然斷電可以減少資料丟失的損失。而這個過程就稱之為“持久化”過程。

2.Redis中持久化方式:

 2.1 快照持久化

預設開啟。一次性把redis中全部的資料儲存一份儲存在硬碟中,如果資料非常多(例如高達10G),則此過程較慢,不適合頻繁執行該持久化操作。因為它每次都是全部資料

2.2 AOF持久化

由於快照持久化每次儲存的都是全部的資料,所以它的儲存時間就不能設定那麼頻繁,否則會導致CPU和儲存等硬體資源的消耗太大。而又為了達到資料的安全性,於是就有了AOF持久化。如下圖場景:

 因為快照持久化設定的頻率過短會給CPU等硬體造成壓力。所以快照持久化不可以過於頻繁。例如上圖,這又會導致一個數據安全性降低的問題。AOF就是用來解決這個問題的。還是上一場景中:

 在這個場景中,也就是在快照持久化的間隙中加入了AOF持久化(即精細持久化)。

2.3 快照持久化和AOF持久化的差別:

快照持久化每次向磁碟中儲存的都是全部的資料,而AOF持久化是將使用者操作Redis時修改的每一個key的語句都儲存起來,還原資料庫的時候直接把語句執行一遍即可(也可以理解成快照持久化儲存的是資料,而AOF持久化儲存的是執行語句),它的頻率可以達到秒。

2.4手動發起快照持久化:

#redis登入方式 + bgsave
.redis-cli -h 127.0.0.1 -p 6379 -a 13456 bgsave

3.如何設定兩種持久化方式的相關資訊?

持久化方式的相關資訊的修改都是在Redis中總的配置檔案redis.conf中進行的。redis.conf檔案在redis的安裝目錄下。例如我的redis安裝在了/opt下,那麼我在/opt下開啟redis安裝的那個目錄後即可看到redis.conf:

 使用以下命令開啟此檔案:

vim redis.conf

如果所安裝的linux系統沒有vim(vi的升級版)這個命令可以選擇使用vi或者通過yum進行下載vim。redis.conf中大致內容(這裡面關於Redis的配置資訊有很多,我只把這篇部落格中用到的資訊複製貼上過來):

用於配置快照持久化的頻率:

save 900 1  #每900s若超過1K資料被修改,便發起一次快照儲存
save 300 10 #每300s若超過10K資料被修改,便發起一次快照儲存
save 60 10000

儲存快照持久化資訊的檔案:

# The filename where to dump the DB
#這個是用於快照持久化儲存其資訊的檔案 即dump.rdb
dbfilename dump.rdb

 資料庫存放目錄:

#用於指明本地資料庫存放目錄如:dump.rdb的存放目錄
#預設"./" 建議手動設定
# The working directory.
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /usr/local/redis/

 例如我執行 cd /usr/local/redis之後觀察此目錄下的資訊,可見快照持久化資訊檔案dump.rdb和AOF持久化資訊檔案appendonly.aof全在這裡進行儲存:

 關於AOF持久化的設定:

#手動開啟AOF持久化方式  預設是no
appendonly yes

# The name of the append only file (default: "appendonly.aof")
#AOF持久化資訊儲存在appendonly.aof中
#此檔案儲存在使用dir 配置的資料庫資訊的存放目錄下
#例如我這裡是:/usr/local/redis/
appendfilename "appendonly.aof"

 配置檔案更改之後需要將之前的Redis程序殺掉,然後重啟Redis才可以使用。且AOF開啟之後,之前Redis中儲存的資訊將會清空。

#ps -A 查詢所有程序
# | 將ps -A 查找出的資訊交給grep命令
# grep redis 在所有程序中搜索出redis
ps -A | grep redis
#強制性關閉程序號為1746的程序
kill -9 1746

使用redis-server + redis.conf配置檔案路徑的方式啟動redis(redis啟動的方式之一 即通過redis-server制定配置檔案啟動):

 設定AOF持久化頻率:

# appendfsync always 每次寫指令都寫入磁碟,即完全保證持久化(對效能影響大)
#每一秒執行一次 效能與持久化進行折中(建議使用)
appendfsync everysec
# appendfsync no 完全依賴於OS系統的此時資源佔有 (持久化無法完全保證,但是效能高)

 4.檢視並分析dump.rdb和appendonly.aof檔案內容:

首先在redis中儲存相應部分資料:

 檢視appendonly.aof檔案內容:

 可見:appendonly.aof中儲存的是每次在Redis中執行的指令。

對appendonly.aof中的備份做優化處理:

現在我把Redis中儲存的age這個key執行三次自增:

 使用vim開啟appendonly.aof觀察其內容:

 可以發現incr每執行一次都被記錄在了appendonly.aof檔案中,這樣子是比較浪費空間的。我們可以對其進行優化處理:

./redis-cli -h 127.0.0.1 -p 6379 -a 123456 bgrewriteaof

 即使用登入命令+bgrewriteaof對aof檔案進行壓縮。觀察壓縮之後的aof檔案內容並與之前的進行對比:

 可見aof檔案中的多個incr變成了一個set age 22。

 檢視dump.rdb中的內容:

在這裡因為執行的指令較少,還看不出其特點。牢牢記住:dump.rdb是持久化的記憶體中的所有資料。

5.總結:

快照持久化和AOF持久化是一個互補的關係。快照持久化來做打的備份,AOF持久化來做細則備份。資料還原的時候要把快照持久化檔案dump.rdb和AOF持久化檔案appendonly.aof一併拿出來用於做資料的還原。如果將A伺服器的這兩個檔案拷貝到B伺服器中的Redis的資料庫存放目錄中,那麼當B這臺伺服器啟動之後,這兩個檔案就會被載入。於是,在B伺服器上就可以看到A伺服器上Redis資料庫中的資料內容。因為當B伺服器的Redis啟動的時候,會從硬碟中讀取dump.rdb和appendonly.aof中的資料,然後將其放入記憶體中。