文章目錄
RDB的全稱是Redis database。
- 顧名思義,RDB就是用來存儲數據的Redis數據庫.
- 所以,通過RDB持久化,就是將存儲在Redis內存中的數據寫入RDB文件,保存到磁盤中,實現持久化。
- Redis 的特點是可以持久化數據,就是將內存中的數據寫入磁盤,確保不會丟失數據,也可以將數據從磁盤加載到內存中。

Redis在開始的操作都是基於內存的,所以性能很高,但是一旦程序關閉,數據就丟失了。
因此,我們需要在指定的時間間隔內將內存數據寫入磁盤,也就是行話中的Snapshot 快照。
恢復時,快照文件直接寫入內存。
這也是Redis 和Memcached 的主要區別之一,因為Memcached 沒有持久化能力。
對於Redis內存數據的持久化,Redis 為我們提供了以下方法:
- 快照方法(RDB,Redis DataBase):將內存數據在某一時刻以二進制形式寫入磁盤;
- 僅追加文件(AOF,Append Only File),記錄所有操作命令,並以文本形式追加到文件中;
- 混合持久化,Redis 4.0之後的新方法,混合持久化它結合了RDB和AOF的優點。寫入時,先將當前數據以RDB的形式寫入文件的開頭,然後將後續的操作命令以AOF的形式保存到文件中,這樣既可以確保Redis重啟時的速度,又可以降低數據丟失的風險。
因為每個持久化方案都有特定的使用場景。
Redis RDB內存數據持久化操作方式
- RDB(Redis DataBase)是將某個時刻的內存快照(Snapshot)以二進制形式寫入磁盤的過程。
- 內存快照就是我們上面說的。它是指內存中數據在某一時刻的狀態記錄。
- 這類似於拍照,當你給朋友拍照時,一張照片可以瞬間記錄下朋友的所有形象。
- 觸發RDB有兩種方式:一種是手動觸發,另一種是自動觸發。
手動觸發RDB
手動觸發持久化有兩種操作:save和bgsave。
它們的主要區別在於是否阻塞Redis主線程的執行。
1、save指令
在客戶端執行save命令,會觸發Redis的持久化,但也會使Redis處於阻塞狀態,直到RDB持久化後才會響應其他客戶端發送的命令,因此在生產環境中必須謹慎使用。
127.0.0.1:6379> save OK 127.0.0.1:6379>
save 執行命令的過程如圖
2、bgsave 指令
- bgsave(background save)是後台保存。
- 它和save命令最大的不同就是bgsave會fork一個子進程來執行持久化。
- 整個過程只有在子進程是fork的時候。才有短暫的阻塞。
- 當子進程創建後,Redis 的主進程就可以響應其他客戶端的請求。
與阻塞整個進程的save命令相比,bgsave命令顯然更適合我們使用。
127.0.0.1:6379> bgsave Background Saving started # 提示开始后台保存 127.0.0.1:6379>
自動觸發RDB
說完手動觸發,再來看看自動觸發。我們可以在配置文件中配置自動觸發的條件。
1、save mn
- save mn 表示在m秒內,如果n個key發生變化,則自動觸發持久化。參數m 和n 可以在Redis 配置文件中找到。
- 例如save 60 1表示在60秒內,只要有一個key發生變化,就會觸發RDB持久化。
- 自動觸發持久化的本質是,如果滿足設置的觸發條件,Redis 會自動執行一次bgsave 命令。
注意:當設置了多個save mn 命令時,任何一個條件都會觸發持久化。
例如,我們設置下面兩個save mn命令:
save 60 10 save 600 20
- Redis鍵值在60s內變化10次時,會觸發持久化;
- 如果Redis的key在60s內變化,如果value變化的次數小於10次,那麼Redis會判斷Redis的key值在600s內是否至少修改了20次,如果是,則觸發持久化。
2、flushall
- flushall 命令用於清除Redis 數據庫。
- 在生產環境中必須謹慎使用。
- 當Redis 執行flushall 命令時,會觸發自動持久化並清除RDB 文件。
3、主從同步觸發
Redis主從復制中,當從節點進行全量複製操作時,主節點會執行bgsave命令,將RDB文件發送給從節點,此過程自動觸發Redis 持久化。
Redis 可以通過命令查詢當前的配置參數。
查詢命令的格式為:config get xxx
例如,如果要獲取RDB 文件的存儲名稱設置,可以使用 config get dbfilename 。
執行效果如下:
127.0.0.1:6379> config get dbfilename 1) "dbfilename" 2) "dump.rdb"
由於Redis服務器在加載RDB文件時會阻塞,直到加載完成,可能會造成很長時間,網站無法訪問。
若想手動刪除Redis的RDB 緩存文件dump.rdb,可以使用以下命令,查找dump.rdb文件儲存路徑▼
find / -name dump.rdb
- 然後,通過SSH手動刪除dump.rdb緩存文件。
Redis設置RDB的配置
關於設置RDB的配置, 你可以使用以下兩種方式:
- 手動修改Redis配置文件
- 使用命令行設置,config set dir “/usr/data”是修改RDB文件的存儲命令
注意:redis.conf中的配置可以通過config get xxx獲取,通過config set xxx value修改,而手動修改Redis配置文件的方法全局有效,即重啟Redis服務器設置的參數不會丟失,而是使用命令修改那樣,Redis 重啟後就會丟失。
但是如果要手動修改Redis配置文件立即生效,需要重啟Redis服務器,命令方式不需要重啟Redis服務器。
RDB文件恢復
Redis服務器啟動時,如果Redis根目錄下存在RDB文件dump.rdb,Redis會自動加載RDB文件恢復持久化數據。
如果根目錄下沒有dump.rdb文件,請先將dump.rdb文件移動到Redis的根目錄下。
當然,Redis啟動時有日誌信息,會顯示RDB文件是否加載。
Redis服務器在加載RDB文件時會阻塞,直到加載完成。
現在我們知道RDB持久化分為手動觸發和自動觸發兩種方式:
- 它的優點是存儲文件小,啟動Redis時數據恢復速度更快。
- 缺點是存在數據丟失的風險。
RDB文件的恢復也很簡單,只需將RDB文件放在Redis的根目錄下,Redis啟動時就會自動加載和恢復數據。
RDB優缺點
1) RDB優點
RDB內容為二進制數據,佔用內存少,更緊湊,更適合作為備份文件;
RDB對於災難恢復非常有用,它是一個壓縮文件,可以更快地傳輸到遠程服務器,用於Redis服務恢復;
RDB可以大大提高Redis的運行速度,因為Redis主進程會Fork一個子進程來持久化數據到磁盤。
Redis主進程不進行磁盤I/O等操作;
與AOF 格式文件相比,RDB 文件的重啟速度更快。
2) RDB的缺點
因為RDB只能保存一定時間間隔的數據,如果中間意外終止Redis服務,會丟失一段時間的Redis數據;
RDB需要頻繁fork才能使用子入口將其保存在磁盤上的過程。
如果數據集很大,fork 可能會很耗時,如果數據集很大,CPU 性能很差,可能會導致Redis 無法為客戶端服務幾毫秒甚至一秒。
當然,我們也可以禁用持久化來提高Redis 的執行效率。
如果你對數據丟失不敏感,可以在客戶端連接時通過執行 config set save "" 命令禁用Redis 的持久化。
在redis.conf中,如果在save開頭註釋掉所有配置,持久化也會被禁止,但一般不這麼做。
希望陳溈亮博客( https://www.chenweiliang.com/ ) 分享的《Redis RDB全稱是什麼? Redis RDB內存數據持久化操作方式》,對您有幫助。
