Redis中RDB持久化

什麼是RDB持久化

Redis是內存數據庫。所謂內存數據庫,就是將數據放在內存中直接操作的數據。它和磁盤數據庫是互補的,各有優缺點。最主要的是:相對於磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大地提高應用的性能。但是它也有缺陷,最主要的就是它是將數據庫狀態存儲在內存中的,佔用的是內存資源,一旦服務器進程退出,服務器中的數據就會消失不見。所以Redis持久化是十分必要的。

Redis數據存儲模式:一種是cache-only, 只做緩存服務,不持久化數據,數據在服務終止後消失。另一種是persistence, 將內存中的數據備份到磁盤文件中,在服務重啓後可恢復。

我們說的RDB持久化就是一種persistence存儲。可以將Redis在內存中的數據庫狀態保存到磁盤裏面,以免數據意外丟失。RDB文件是一個二進制文件dump.rdb,保存在硬盤中,服務器重啓時會自動執行載入RDB文件。

生成RDB文件

  • SAVE命令:阻塞服務器進程,直到服務器創建好RDB文件爲止,期間不能處理任何命令請求。
  • BGSAVE命令:服務器進程會fork()一個子進程,這個子進程來負責創建RDB文件,所以服務器進程(父進程)可以繼續處理命令請求。但是不能執行SAVE命令,BGSAVE命令,BGREWRITEAOF命令。因爲這些命令會導致競爭或者極大降低服務器性能。試想多個子進程都在獨立執行數據庫數據的訪問,磁盤的存儲,當數據庫很大的時候是一件十分可怕的事情。
  • 自動間隔性存儲:Redis還可以允許用戶設置服務器配置的SAVE選項來讓服務器每隔一段時間自動執行一次BGSAVE命令。比如像服務器提供如下配置:

            ```
            save 900 1
            save 300 10
            ```
    

    第一個表示服務器在900秒以內,對數據庫進行了至少一次的修改就執行BGSAVE。
    第二個表示服務器在300秒以內,對數據庫進行了至少10次的修改就執行BGSAVE。

RDB文件結構

這裏寫圖片描述
RDB文件保存的是二進制數據,和以太網幀或者TCP報文有點像。
第一層:
REDIS: 5個字節, 保存”REDIS”這5個字符,作爲載入時快速檢查是否爲RDB文件,和前同步碼有點類似。
da-version: 4字節, 保存版本號。
database0: 0號數據庫,存在即表明非空,空的數據庫長度爲0字節,不保存。
database3: 3號數據庫
EOF: 1字節,標誌RDB正文的結束。
check_sum: 8字節,校驗和,對REDIS, db_ersion, databases, EOF四個部分內容計算得出的,載入時檢測RDB文件是否出錯。

第二層:
是對第一層中database0的“放大”版本。
SELECTDB: 1字節,當讀入程序遇到這個值時,它知道接下來讀入的是一個數據庫號碼。
db_number: 保存着一個數據庫號碼,當程序讀入db_number時,服務器會調用SELECT命令,根據讀入的數據庫號碼切換數據庫,使得之後讀入的鍵值對數據能夠載入到正確的數據庫中。
key_value_pairs: 保存了數據庫中的鍵值對數據,帶有過期時間的鍵值對和不帶有過期時間的鍵值對是不同的,具體的看第三層。

第三層:
左邊的是不帶過期時間的鍵值對
TYPE:記錄了鍵值對中值value的類型,長度爲1字節。(因爲值得類型都是字符串對象)當服務器讀入RDB時,會根據這個TYPE字段來決定如何讀入和解釋value字段。
key:字符串對象,根據key的內容不同,其長度也會不同。
value: 不同的TYPE類型對應不同的value編碼方式。主要有字符串對象,列表對象,集合對象,哈希表對象,有序集合對象等。

右邊是帶過期時間的鍵值對
EXPIRETIME_MS: 1字節,是一個常量,告訴讀入程序,接下來要讀入的是一個一毫秒爲單位的過期時間。
ms: 8字節, 以毫秒爲單位的過期時間,是一個UNIX時間戳,代表着從格林喬治時間開始到現在的毫秒數。
key和value與左邊的相同。

發佈了30 篇原創文章 · 獲贊 23 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章