今天分享一下Redis的持久化、事務、管道相關的知識點,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。
Redis是一個鍵值對數據庫,服務器中通常包含着任意個非空數據庫,而每個非空數據庫中又可以包含任意個鍵值對,我們將是服務器中的非空數據庫以及它們的鍵值對統稱爲數據庫狀態。
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服務器根據save選項所設置的保存條件,自動執行bgsave命令,進行間隔性數據保存的實現原理。
4、加解密
RDB持久化功能所生成的RDB文件是一個經過壓縮的二進制文件,通過該文件可以還原生成RDB文件時的數據庫狀態。
5、RDB持久化優缺點
(1)優點
- 適合大規模的數據備份、恢復;
- 可以定時備份;
- 對數據一致性、完整性要求不高的場景可以使用;
- RDB文件在內存中的加載速度要比AOF塊;
(2)缺點
- 因爲是定時備份,如果Redis宕機的話,會丟失一部分數據;
- 因爲是數據的全量同步,如果數據量過大,會產生大量IO,嚴重影響服務器性能;
- 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)缺點
- 等量級的命令,AOF持久化文件要大於RDB持久化文件;
- 恢復速度慢於RDB;
4、數據恢復順序和加載流程
當同時開啓AOF和RDB的時候,會優先加載AOF文件來恢復數據,因爲通常情況下AOF文件比RDB文件備份的數據要完整。
三、Redis事務
1、Redis事務是什麼?
可以一次性順序執行多個命令,不可被其它命令插隊,但是,Redis的事務不能回滾。
2、Redis事務常用命令
(1)discard,取消事務,放棄執行事務內的所有命令;
(2)exec,執行所有命令;
(3)multi,標記一個事務塊的開始;
(4)unwatch,取消watch命令對所有key的監視;
(5)watch key,監視某個key,如果這個key在事務執行之前被其它命令改動,那麼事務將被打斷;
3、事務命令執行順序
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管道效果。