圖解Redis,談談Redis的持久化,RDB快照與AOF日誌

ITPUB社群發表於2023-03-13

大家好,我是哪吒。

上一篇分享了離譜!面試為啥都問Redis?趕緊補一下,完成了Redis的初體驗。

今天分享一下Redis的持久化、事務、管道相關的知識點,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。

Redis是一個鍵值對資料庫,伺服器中通常包含著任意個非空資料庫,而每個非空資料庫中又可以包含任意個鍵值對,我們將是伺服器中的非空資料庫以及它們的鍵值對統稱為資料庫狀態。

圖解Redis,談談Redis的持久化,RDB快照與AOF日誌

Redis是記憶體資料庫,它將資料儲存在記憶體中,如果不能將記憶體中的資料持久化到磁碟中,Redis突然當機,會導致資料丟失。

為了解決這個問題,Redis提供了RDB持久化功能,RDB持久化會將Redis在記憶體中的資料庫狀態儲存到磁碟中,避免資料意外丟失。

一、RDB持久化

RDB,英文全稱Redis DataBase,在指定的時間間隔,將記憶體中的資料寫入磁碟,待恢復時再將磁碟中的資料寫入記憶體。

1、自動觸發

redis.conf配置檔案中,save <seconds> <changes>,比如 save 60 20,在60秒內修改20次就自動觸發RDB備份。

2、手動觸發

透過save和bgsave手動觸發RDB備份。

(1)save,在主程式中執行會阻塞當前Redis伺服器,直到RDB持久化完成,也就是說save持久化期間,Redis就不能用了,禁止使用。

(2)bgsave,不阻塞當前Redis伺服器,Redis會fork一個子程式,非同步進行快照操作。

禁用快照:redis-cli config set save ""

3、設定儲存條件

伺服器程式會根據save選項所設定的儲存條件,設定伺服器狀態redisServer結構的saveparams屬性。

dirty計數器記錄距離上次成功執行save命令後,伺服器對資料狀態進行了多少次修改。

lastsave屬性是一個UNIX時間戳,記錄了伺服器上一次成功執行save命令的時間。

屬性是一個陣列,陣列中的每個元素都是一個saveparam結構,每個saveparam結構都儲存了一個save選項設定的儲存條件。

圖解Redis,談談Redis的持久化,RDB快照與AOF日誌

以上就是Redis伺服器根據save選項所設定的儲存條件,自動執行bgsave命令,進行間隔性資料儲存的實現原理。

4、加解密

RDB持久化功能所生成的RDB檔案是一個經過壓縮的二進位制檔案,透過該檔案可以還原生成RDB檔案時的資料庫狀態。

5、RDB持久化優缺點

(1)優點

  1. 適合大規模的資料備份、恢復;
  2. 可以定時備份;
  3. 對資料一致性、完整性要求不高的場景可以使用;
  4. RDB檔案在記憶體中的載入速度要比AOF塊;

(2)缺點

  1. 因為是定時備份,如果Redis當機的話,會丟失一部分資料;
  2. 因為是資料的全量同步,如果資料量過大,會產生大量IO,嚴重影響伺服器效能;
  3. RDB持久化時,會fork一個子程式,如果資料過大, 可能會導致伺服器的瞬間延遲;fork的時候記憶體中的資料會被克隆一份,是否會造成記憶體溢位,值得考慮;

6、哪些情況會觸發RDB持久化?

(1)redis.conf中的定時配置;

(2)手動執行save、bgsave命令;

(3)執行flushall、flushdb命令,產生的.rdb檔案是空的;

(4)執行shutdown命令,且沒有設定AOF持久化;

(5)主動複製時,主節點自動觸發;

注意:save和bgsave不能同時執行,如果bgsave命令正在執行,那麼客戶端傳送的save命令會被拒絕執行,伺服器禁止save和bgsave同時執行是為了避免父程式和子程式同時執行兩個rdbSave呼叫,防止產生競爭條件。

建立RDB檔案的實際工作是由rdb.c/rdbSave函式完成,save和bgsave會以不同的方式呼叫這個函式。

二、AOF持久化

AOF,Append Only File,以日誌的方式記錄每一個操作命令,只追加不修改,Redis啟動時會讀取該檔案,重新執行一遍之前的寫操作命令,達到恢復資料的效果。

預設不開啟,需要更改為appendonly yes,開啟AOF快照功能。

1、AOF持久化過程

(1)在執行Redis命令時,Redis會將這些命令放入AOF快取中,AOF快取是位於記憶體中的一個區域,AOF快取中的命令達到一定數量後,批次寫入磁碟,避免頻繁的磁碟IO操作

(2)根據AOF緩衝區同步檔案的三種寫回策略,將命令寫到磁碟的AOF檔案中;

(3)隨著寫入AOF內容的增加,會根據規則進行命令的合併,起到壓縮AOF檔案的效果;

(4)當Redis重啟時,會根據AOF檔案,依此執行命令,恢復記憶體資料;

很多人會問,如果加入到AOF快取的資料還沒寫入磁碟,此時伺服器當機了,資料不會產生丟失嗎?

系統提供了fsync和fdatasync兩個同步函式,他們可以強制作業系統立即將快取區中的資料寫入到磁碟裡,確保寫入資料的完整性。

2、appendfsync的選項值

(1)Always,同步寫回,每個寫命令執行完立刻同步到磁碟;最多隻會丟失一個命令的資料,最安全,但是效率最低;

(2)everysec,每秒寫回;它最多丟失1秒的資料;

(3)no,作業系統控制的寫回,每個命令執行完,存到AOF快取中,由作業系統決定,啥時候將命令寫入到磁碟AOF檔案中;

3、AOF持久化優缺點

(1)優點

更好的保護資料不丟失,效能高,可做緊恢復。

(2)缺點

  1. 等量級的命令,AOF持久化檔案要大於RDB持久化檔案;
  2. 恢復速度慢於RDB;

4、資料恢復順序和載入流程

當同時開啟AOF和RDB的時候,會優先載入AOF檔案來恢復資料,因為通常情況下AOF檔案比RDB檔案備份的資料要完整。

圖解Redis,談談Redis的持久化,RDB快照與AOF日誌

三、Redis事務

1、Redis事務是什麼?

可以一次性順序執行多個命令,不可被其它命令插隊,但是,Redis的事務不能回滾。

2、Redis事務常用命令

(1)discard,取消事務,放棄執行事務內的所有命令;

(2)exec,執行所有命令;

(3)multi,標記一個事務塊的開始;

(4)unwatch,取消watch命令對所有key的監視;

(5)watch key,監視某個key,如果這個key在事務執行之前被其它命令改動,那麼事務將被打斷;

3、事務命令執行順序

圖解Redis,談談Redis的持久化,RDB快照與AOF日誌

4、事務的ACID特性

在Redis中,事務總是具有原子性(Atomicity)一致性(Consistency)隔離性(Isolation),並且Redis執行在某些特殊模式下,也具有永續性(Durability)

(1)原子性

事務具有原子性,指的是事務中的多個操作當做一個整體來執行,伺服器要麼就執行事務中的全部操作,要麼就一個操作也不執行。

(2)一致性

如果資料庫在執行事務之前是一致的,那麼在事務執行之後,無論事務執行是否成功,資料庫也應該是一致的。

(3)隔離性

隔離性指即使資料庫中有多個事務併發地執行,各個事務之間也不會互相影響,並且在併發狀態下執行的事務和序列執行的事務產生的結果完全相同。

(4)永續性

當一個事務執行完畢時,執行這個事務所得的結果已經被儲存到硬碟裡,即使伺服器此時當機,執行事務所得的結果也不會丟失。

四、Redis管道

1、Redis管道釋義

Redis是一種基於客戶端-服務端模型以及請求響應協議的TCP服務,每個請求會遵循如下操作:

(1)客戶端向服務端傳送命令,① 傳送命令;② 命令排隊;③ 命令執行;④ 返回結果,監聽Socket返回,通常以阻塞模

(2)式等待服務端響應;

服務端處理命令,並將結果返回給客戶端;

上面兩步走,稱為RTT,資料往返於兩端的時間,Round Trip Time。

如果需要執行大量命令,那麼新的命令要等待上一個命令執行完畢才能執行,會頻繁的呼叫系統IO,頻繁傳送網路請求,同時需要Redis呼叫多次read()和write()系統方法,系統方法會將資料從使用者態轉移到核心態,效能不佳。

2、注意事項

(1)pipeline快取的指令只會依此執行,不保證原子性,如果執行中發生異常,也會繼續執行後面的指令;

(2)使用pipeline組裝的命令個數不能太多,不然可能會造成阻塞時間過長的現象,同時服務端也會被迫回覆一個佇列答覆,佔用過多記憶體;

3、程式碼實戰

編寫一個命令指令碼,新增幾個不同型別的資料。

透過 cat run.txt | redis-cli -a 111111 --pipe 命令,體驗Redis管道效果。

圖解Redis,談談Redis的持久化,RDB快照與AOF日誌


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2939351/,如需轉載,請註明出處,否則將追究法律責任。

相關文章