redis(10)--RDB持久化
目錄
保存
命令
保存命令沖突性
載入
自動間隔性保存
數據結構
dirty計數器與lastsave
檢查保存條件是否滿足
RDB 文件結構
組成部分
DB-DATA部分
KEY-VALUE-PAIRS
RDB分析工具
在運行情況下, Redis 以數據結構的形式將數據維持在內存中, 為了讓這些數據在 Redis 重啟之后仍然可用, Redis 分別提供了 RDB 和 AOF 兩種持久化模式。
在 Redis 運行時, RDB 程序將當前內存中的數據庫快照保存到磁盤文件中, 在 Redis 重啟動時, RDB 程序可以通過載入 RDB 文件來還原數據庫的狀態。
?
RDB 功能最核心的是 rdbSave 和 rdbLoad 兩個函數, 前者用于生成 RDB 文件到磁盤, 而后者則用于將 RDB 文件中的數據重新載入到內存中:
保存
命令
- SAVE
阻塞主進程,服務器不處理任何客戶端請求。
- BGSAVE
子進程處理,不阻塞主進程。
如果 RDB 文件已存在, 那么新的 RDB 文件將替換已有的 RDB 文件。
保存命令沖突性
- SAVE,BGSAVE互相沖突,并且BGSAVE之間也沖突。
- BGSAVE,BGREWRITEAOF 互相沖突。(操作方面沒有什么沖突,主要是考慮性能)
載入
REDIS服務器啟動時載入。
載入期間, 服務器每載入 1000 個鍵就處理一次所有已到達的請求, 不過只有 PUBLISH 、 SUBSCRIBE 、 PSUBSCRIBE 、 UNSUBSCRIBE 、 PUNSUBSCRIBE 五個命令的請求會被正確地處理, 其他命令一律返回錯誤
發布與訂閱功能和其他數據庫功能是完全隔離的,前者不寫入也不讀取數據庫,所以在服務器載入期間,訂閱與發布功能仍然可以正常使用,而不必擔心對載入數據的完整性產生影響
如果服務器在啟動時, 打開了 AOF 功能, 那么程序優先使用 AOF 文件來還原數據。 只有在 AOF 功能未打開的情況下, Redis 才會使用 RDB 文件來還原數據。
自動間隔性保存
因為BGSAVE命令在后臺執行,Redis允許用戶配置服務器save選項,讓服務器每隔一段時間自動執行一次BGSAVE命令。
save 900 1? #900秒內進行了一次修改
save 300 10 #300秒內進行了10次修改
save 60 10000? #60秒內進行了10000次修改
只要滿足了任意一個配置BGSAVE就會被觸發。
數據結構
struct redisServer {//保存多個save配置的數組。struct saveparam * saveparams;//修改計數器long dirty;//上次保存時間time_t lastsave; }struct saveparam {//間隔秒數time_t seconds;//修改數int changes; }?
dirty計數器與lastsave
除了saveparams數組外,服務器狀態還維持了一個dirty計數器與lastsave屬性。
dirty計數器記錄從上次保存之后,服務器的修改次數。
lastsave,UNIX時間戳,記錄上次保存命令的時間。
檢查保存條件是否滿足
serverCron默認每隔100毫秒就會執行一次。其中一項工作,檢查save參數,確認是否執行BGSAVE命令。
RDB 文件結構
組成部分
+-------+-------------+-----------+-----------------+-----+-----------+ | REDIS | RDB-VERSION | SELECT-DB | KEY-VALUE-PAIRS | EOF | CHECK-SUM | +-------+-------------+-----------+-----------------+-----+-----------+|<-------- DB-DATA ---------->|- REDIS:文件標識符,固定5個字符:REDIS。
- RDB-VERSION:Rredis版本,4字節,不同版本不兼容。
- DB-DATA:每個非空數據庫的數據
- EOF:數據庫內容的結尾。
- CHECH-SUM:所有文件內容校驗和,0表示關閉校驗。
DB-DATA部分
SELECT-DB:數據庫編號。
KEY-VALUE-PAIRS:數據庫鍵值對。
KEY-VALUE-PAIRS
+----------------------+---------------+-----+-------+ | OPTIONAL-EXPIRE-TIME | TYPE-OF-VALUE | KEY | VALUE | +----------------------+---------------+-----+-------+- OPTIONAL-EXPIRE-TIME
過期時間。未設置過期時間,則不出現。設置過期時間的格式:EXPIRETIME_MS | ms 。EXPIRETIME_MS 1字節常量,表示以毫秒表示過期時間。ms:過期時間,單位毫秒。
- TYPE-OF-VALUE:鍵值類型,實際存儲類型。1字節。
- KEY:編碼方式與REDIS_RDB_TYPE_STRING類型的value一樣。
- VALUE:類型不同,編碼不同。
RDB分析工具
Redis本身帶有RDB文件檢查工具redis-check-dump。
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的redis(10)--RDB持久化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java-Calendar
- 下一篇: redis(11)--AOF持久化