2016-12-22 13:58:48
該系列文章連結
NoSQL 資料庫簡介
Redis的安裝及及一些雜項基礎知識
Redis 的常用五大資料型別(key,string,hash,list,set,zset)
Redis 配置檔案介紹
Redis 持久化之RDB
Redis 持久化之AOF
Redis 主從複製
Redis 事務
Redis 釋出與訂閱
Redis jdedis 介紹
redis 作為快取的優秀資料庫,也提供了將快取中的資料寫入到硬碟的手段。
有兩種:一種是 RDB,另一種則是 AOF,本篇文章介紹 RDB。
1.RDB 簡介
RDB:redis database
定義:在指定的時間間隔內將記憶體中的資料集快照寫入到硬碟中,也就是 snapshot 快照,它恢復時是將快照檔案直接讀取到記憶體中
2.RDB 持久化過程
簡單來說,就是 redis 會單獨建立(fork)一個子程式來進行持久化,先將資料寫入到硬碟中的一個臨時檔案中,等到持久化過程結束,就用這個臨時檔案替換上次持久化好的檔案。
整個過程中,主程式不進行任何與之相關的IO操作,這就確保了 redis 的極高效能
那麼:什麼叫 fork?
redis 會複製一個與當前程式一樣的程式。新程式的所有資料(eg:程式計數器)數值都和原程式一致,但是是一個全新的程式,並作為原程式的子程式
3.RDB 在 redis.conf 的配置
RDB 在 redis.conf 中的模組是 snapshotting。
下面簡單介紹下 snapshotting
3.1 save
將資料庫儲存在磁碟上:
save <seconds> <changes>
如果同時發生了給定的秒數和針對DB的給定寫入運算元,則將儲存資料庫。
在下面的示例中,出現這些情況將會儲存:
在900秒(15分鐘)內至少改變了1個 key
在300秒(5分鐘)內至少改變了10個 key
在60秒內至少改變了10000個 key
注意:您可以通過註釋掉所有”save”行來完全禁用儲存。
也可以通過新增帶有單個空字串引數的save指令來刪除所有先前配置的儲存點,如下例所示:
save “”
3.2 stop-writes-on-bgsave-error
預設情況下,如果啟用了RDB快照(至少一個儲存點)並且最新的後臺儲存失敗,Redis將停止接受寫入命令。
這將使使用者意識到(以一種困難的方式)資料沒有正確地儲存在磁碟上,否則很可能沒有人會注意到以至於會發生一些災難。
如果後臺儲存過程將再次開始工作,Redis將會自動允許再次寫入。
然而,如果您已設定對Redis伺服器和永續性的正確監視,則可能需要禁用此功能,以便即使磁碟,許可權等存在問題,Redis也將繼續正常工作。
3.3 rdbcompression
資料庫在 dumb.rdb 檔案儲存資料時使用LZF壓縮字串物件?
預設設定為“yes”,因為它幾乎總是一個勝利。
如果要在儲存子項中儲存一些CPU,請將其設定為“no”,但如果您具有可壓縮值或鍵,則資料集可能會更大。
(在業界這個一般設定為 no,因為很多程式設計師認為不需要給老闆省硬碟空間,畢竟在多買個硬碟就好了。空間換時間!)
3.4 rdbchecksum
RDB的第5版開始,CRC64校驗和位於檔案的末尾。
這使得格式更能抵抗損壞,但在儲存和載入RDB檔案時有一定的效能損失(大約10%),因此您可以禁用它以獲得最佳效能。
禁用校驗和建立的RDB檔案的校驗和為零,將告訴載入程式碼跳過檢查。
3.5dbfilename
RDB方式儲存資料的檔名
3.6 dir
工作目錄。
資料將使用`dbfilename`配置指令指定的檔名寫入此目錄
aof 檔案也將被建立在此目錄中。
請注意,您必須在此處指定目錄,而不是檔名。
4.如何觸發或停止 RDB
觸發 RDB 有很多種方式:
4.1 在 redis.conf -> save 中寫下觸發的條件
然後滿足此條件會自動以 RDB 方式持久化
4.2 使用 save 或者 bgsave 命令主動觸發快照
save: save 只管儲存,其它所有讀寫操作都會阻塞
bgsave: redis 會在後臺非同步時進行快照操作,快照同時可以響應客戶端請求,也可以通過 lastsave 命令獲取最後一次成功執行快照的時間
4.3 執行 flushall 命令,這沒有什麼意義
動態停止 RDB 儲存規則方法:
redis-cli config set save “”
5.反持久化:將 RDB 的資料還原到記憶體中
config get dir 獲取儲存資料的目錄
將備份檔案 dump.rdb 移動到 redis 安裝目錄並啟動服務即可
6.RDB 的優勢與劣勢
6.1 優勢
適合大規模的資料恢復
對資料完整性和一致性要求不高
6.2 劣勢
在一定時間間隔內做一次備份,所以如果 redis 出現意外的話,就會丟失最後一次的所有修改
fork 父程式的時候,父程式記憶體中的資料被克隆了一份,大致 2 倍的膨脹率需要考慮