Redis 相對(duì)于其他NoSQL 內(nèi)存數(shù)據(jù)庫而言壮啊,除了更富的數(shù)據(jù)結(jié)構(gòu)和速度快之外嫉鲸,Redis 的豐富的持久化方案也就一個(gè)很顯著的優(yōu)勢(shì),Redis 支持RDB歹啼、AOF玄渗、混合持久化三種模式。RDB(snapshotting) 是一種內(nèi)存快照的方式進(jìn)行持久化狸眼,AOF(append-only-file)是通過追加寫入命令的方式進(jìn)行持久化藤树,混合持久化是指RDB和AOF協(xié)同完成持久化工作來發(fā)揮各自有點(diǎn)的持久化方式。
本篇講的是RDB持久化:
上面提到了RDB文件實(shí)際上是一種內(nèi)存快照拓萌,直接截取某個(gè)時(shí)間點(diǎn)的Redis中的全部數(shù)據(jù)岁钓,很顯然特點(diǎn)是恢復(fù)速度會(huì)很快(將快照加載到內(nèi)存中),然后RDB文件是一個(gè)很緊湊的二進(jìn)制文件適合保存。但是也存在一定的缺點(diǎn)甜紫,在創(chuàng)建RDB快照之后來的命令及產(chǎn)生的數(shù)據(jù)變動(dòng)相當(dāng)于是無法進(jìn)行持久化記錄的(無法實(shí)時(shí)保存降宅,另外bgsave代價(jià)還挺高的,save又會(huì)阻塞redis)囚霸,所以說備份到斷電這段時(shí)間是存在一定的數(shù)據(jù)不一致情況的,并且RDB持久化出來的RDB快照很有可能存在版本兼容問題(不能適用于其他版本的Redis 集群)激才。
RDB 持久化有自動(dòng)觸發(fā)拓型、手動(dòng)觸發(fā)兩種方式。
自動(dòng)觸發(fā)
具體可以看一下redis.conf 中的配置項(xiàng)及對(duì)應(yīng)注釋來了解這一部分內(nèi)容瘸恼,翻一下注釋就很明了了:
當(dāng)達(dá)到如下條件的時(shí)候就出發(fā)自動(dòng)持久化劣挫,這種持久化在后臺(tái)進(jìn)行的bgsave
先看一下save選項(xiàng):
save 900 1:表示900 秒內(nèi)如果至少有 1 個(gè) key 的值變化,則保存
save 300 10:表示300 秒內(nèi)如果至少有 10 個(gè) key 的值變化东帅,則保存
save 60 10000:表示60 秒內(nèi)如果至少有 10000 個(gè) key 的值變化压固,則保存
再看下一段,RDB持久化時(shí)靠闭,redis 默認(rèn)不接受寫請(qǐng)求帐我,但不阻斷讀請(qǐng)求(是一種讀寫分離的方式)。
stop-writes-on-bgsave-error :默認(rèn)值為yes愧膀。當(dāng)啟用了RDB且最后一次后臺(tái)保存數(shù)據(jù)失敗拦键,Redis是否停止接收數(shù)據(jù)。這會(huì)讓用戶意識(shí)到數(shù)據(jù)沒有正確持久化到磁盤上檩淋,否則沒有人會(huì)注意到災(zāi)難(disaster)發(fā)生了芬为。如果Redis重啟了师坎,那么又可以重新開始接收數(shù)據(jù)了
rdbcompression 飒泻;默認(rèn)值是yes。對(duì)于存儲(chǔ)到磁盤中的快照侯嘀,可以設(shè)置是否進(jìn)行壓縮存儲(chǔ)日戈。如果是的話询张,redis會(huì)采用LZF算法進(jìn)行壓縮。如果你不想消耗CPU來進(jìn)行壓縮的話涎拉,可以設(shè)置為關(guān)閉此功能瑞侮,但是存儲(chǔ)在磁盤上的快照會(huì)比較大。
rdbchecksum :默認(rèn)值是yes鼓拧。在存儲(chǔ)快照后半火,我們還可以讓redis使用CRC64算法來進(jìn)行數(shù)據(jù)校驗(yàn),但是這樣做會(huì)增加大約10%的性能消耗季俩,如果希望獲取到最大的性能提升钮糖,可以關(guān)閉此功能。
dbfilename :設(shè)置快照的文件名,默認(rèn)是 dump.rdb
dir:設(shè)置快照文件的存放路徑店归,這個(gè)配置項(xiàng)一定是個(gè)目錄阎抒,而不能是文件名。默認(rèn)是和當(dāng)前配置文件保存在同一目錄消痛。
總體來說且叁,就是達(dá)到save的觸發(fā)條件時(shí),默認(rèn)bgsave 將內(nèi)存快照保存到當(dāng)前redis.conf 同級(jí)目錄下秩伞。
手動(dòng)觸發(fā)
save
這個(gè)命令會(huì)阻塞Redis 服務(wù)器逞带,一直到save命令執(zhí)行完才會(huì)接受其他的新的處理命令。
bgsave
bgsave時(shí)會(huì)創(chuàng)建一個(gè)fork一個(gè)子進(jìn)程纱新,RDB持久化工作由子進(jìn)程進(jìn)行展氓。僅fork期間會(huì)阻塞接收新的處理命令。
恢復(fù):
數(shù)據(jù)恢復(fù)的過程脸爱,整個(gè)Redis 都是被阻塞在那里的遇汞,一直到持久化完成才正常工作。具體恢復(fù)步驟就是把文件移到剛才dir指定的文件下簿废,然后啟動(dòng)redis 就可以啦空入。