Redis基礎(chǔ)知識(shí)3-持久化

  • 注意: 撰寫本文目的主要是為了給自己做一個(gè)備忘錄,如果你學(xué)過(guò)Redis并且希望從本文中找到一些忘記的知識(shí)點(diǎn),那么你可以閱讀本文章。由于文章內(nèi)講解并不是很多,因此此文章并不適合小白入門使用。

1.Redis簡(jiǎn)介

  • 官網(wǎng)介紹:
    在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,也就是行話講的Snapshot快照,它恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存里。
  • Redis是什么:
    Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來(lái)進(jìn)行持久化,會(huì)先將數(shù)據(jù)寫入到一個(gè)臨時(shí)文件中,待持久化過(guò)程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。整個(gè)過(guò)程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能。如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是很敏感,那RDB方式要比AOP方式更加的高效。RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。
  • Fork:
    Fork的作用是復(fù)制一個(gè)與當(dāng)前進(jìn)程一樣的進(jìn)程。新進(jìn)程的所有數(shù)據(jù)(變量、環(huán)境變量、程序計(jì)數(shù)器)數(shù)值都和原進(jìn)程一致,但是是一個(gè)全新的進(jìn)程,并作為原進(jìn)程的子進(jìn)程。

2.RDB(Redis DataBase)

RDB存儲(chǔ):

  • RDBRedis會(huì)將數(shù)據(jù)存儲(chǔ)在dump.rdb文件中。
  • 如果使用shutdown或者系統(tǒng)突然崩潰或關(guān)機(jī)使得Redis突然停止工作時(shí),Redis會(huì)將此時(shí)表中的數(shù)據(jù)保存至dump.rdb文件中,執(zhí)行一次save操作。
  • 當(dāng)滿足save條件時(shí)(規(guī)定時(shí)間內(nèi)操作了指定次數(shù):插入、刪除、更新,不包括get),Redis會(huì)將表中的數(shù)據(jù)保存至dump.rdb文件中,也會(huì)執(zhí)行save操作。save操作執(zhí)行條件如下(save 秒鐘 寫操作次數(shù)):
    isave執(zhí)行條件

Redis.conf中Snapshot相關(guān)配置:

Redis.conf中Snapshot相關(guān)配置

  • 直接輸入save可以立即執(zhí)行備份。

禁用:

  • 如果想禁用RDB持久化策略,只要不設(shè)置任何save指令,或者給save傳入一個(gè)空字符串也可以

Stop-writes-on-bgsave-error

Stop-writes-on-bgsave-error

rdbcompression壓縮

rdbcompression壓縮

如何觸發(fā)RDB快照:

  • 配置文件中默認(rèn)的快照配置。
    冷拷貝直接使用,可以cp dump.rdb dump_new.rdb
  • 命令save或是bgsave
    1.Save:save時(shí)只管保存,其他不管,全部阻塞。
    2.BGSAVE:Redis會(huì)在后臺(tái)異步進(jìn)行快照操作,快照同時(shí)還可以響應(yīng)客戶端請(qǐng)求。可以通過(guò)lastsave命令獲取最后一次成功執(zhí)行快照的時(shí)間。
  • 執(zhí)行flushall命令,也會(huì)產(chǎn)生dump.rdb文件,但里面是空的,無(wú)意義。

如何恢復(fù):

  • 將備份文件(dump.rdb)移動(dòng)到redis安裝目錄并啟動(dòng)服務(wù)即可。
  • CONFIG GET dir獲取目錄。

優(yōu)勢(shì):

  • 適合大規(guī)模的數(shù)據(jù)恢復(fù)。
  • 對(duì)數(shù)據(jù)完整性和一致性要求不高。

劣勢(shì):

  • 在一定間隔時(shí)間做一次備份,所以如果redis意外down掉的話,就會(huì)失去最后一次快照后的所有修改。
  • Fork的時(shí)候,內(nèi)存中的數(shù)據(jù)被克隆了一份,大致2倍的碰著性需要考慮。

如何停止:

  • 動(dòng)態(tài)所有停止RDB保存規(guī)則的方法:redis-cli config set save ""

3.AOF(Append Only File)

3.1.是什么

  • 以日志的形式來(lái)記錄每個(gè)文件寫操作,將Redis執(zhí)行過(guò)的所有寫指令記錄下來(lái)(讀操作不記錄),只許追加文件但不可以改寫文件,redis啟動(dòng)之初會(huì)讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis重啟的話就根據(jù)日志文件的內(nèi)容將指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。

3.2.AOF配置文件

AOF配置文件

3.3.注意事項(xiàng)

  • 自動(dòng)生成的aof配置文件最后會(huì)有FLUSHALL指令,即加載完所有的數(shù)據(jù)恢復(fù)工作之后,會(huì)執(zhí)行FLUSHALL清空指令。
  • 若AOF配置中包含非法語(yǔ)句,則Redis-server會(huì)啟動(dòng)失敗。此時(shí),可以使用redis-check-aof --fix 文件名稱來(lái)排查文件中的錯(cuò)誤。

3.4.配置位置

  • appendonly no:默認(rèn)是no,yes就打開aof持久化

3.5.APPEND ONLY MODE追加

  • appendonly:
  • appendfilename:
  • Appendfsync:
    1.Always:同步持久化 每次發(fā)生數(shù)據(jù)變更會(huì)被立即記錄到磁盤 性能較差且數(shù)據(jù)完整性比較好。
    2.Everysec:出廠默認(rèn)推薦,異步操作,每秒紀(jì)錄 如果一秒內(nèi)宕機(jī),有數(shù)據(jù)丟失。
    3.No**
  • No-appendfsync-on-rewrite :重寫時(shí)是否可以運(yùn)用Appendfsync,用默認(rèn)no即可,保證數(shù)據(jù)安全性。
  • Auto-aof-rewrite-min-size:設(shè)置重寫的基準(zhǔn)值
  • Auto-aof-rewrite-percentage:設(shè)置重寫的基準(zhǔn)值

3.6.AOF啟動(dòng)/修復(fù)/恢復(fù)

  • 正?;謴?fù):
    1.啟動(dòng):修改默認(rèn)的appendonly no.,改為yes。
    2.將所有數(shù)據(jù)的aof文件復(fù)制一份保存到對(duì)應(yīng)目錄(config get dir)
    3.恢復(fù):重啟redis然后重新加載
  • 異?;謴?fù):
    1.啟動(dòng):設(shè)置Yes
    2.備份被寫壞的AOF文件
    3.Redis-check-aof --fix進(jìn)行修復(fù)
    4.重啟redis然后重新加載

3.7.Rewrite

是什么:
AOF采用文件追加方式,文件會(huì)越來(lái)越大,為避免出現(xiàn)此情況,新增了重寫機(jī)制,當(dāng)AOF文件的大小超過(guò)所有設(shè)定的閾值時(shí),Redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集,可以使用命令bgrewriteaof

重寫原理

  • AOF文件持續(xù)增長(zhǎng)而過(guò)大時(shí),會(huì)fork出一條新進(jìn)程來(lái)將文件重寫(也是先寫臨時(shí)文件最后再rename),遍歷新進(jìn)程的內(nèi)存中數(shù)據(jù),每條記錄有一條的Set語(yǔ)句,重寫aof文件的操作,并沒(méi)有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫(kù)內(nèi)容用命令的方式重寫了一個(gè)新的aof文件,這點(diǎn)和快照有點(diǎn)類似。

觸發(fā)機(jī)制

  • Redis會(huì)記錄上次重寫時(shí)的AOF大小,默認(rèn)配置是當(dāng)AOF文件大小是上次rewrite后大小的一倍且文件大于64M時(shí)觸發(fā)。

3.8.優(yōu)勢(shì)

  • 每秒同步:appendfsync always 同步持久化 每次發(fā)生數(shù)據(jù)變更會(huì)被立即記錄到磁盤 性能較差且數(shù)據(jù)完整性比較好。
  • 每修改同步:appendfsync everysec 出廠默認(rèn)推薦,異步操作,每秒紀(jì)錄 如果一秒內(nèi)宕機(jī),有數(shù)據(jù)丟失。
  • 不同步:appendfsync no 從不同步

3.9.劣勢(shì)

  • 相同數(shù)據(jù)集的數(shù)據(jù)而言aof文件要遠(yuǎn)大于rdb文件,恢復(fù)速度慢于rdb
  • Aof運(yùn)行效率要慢于rdn,每秒同步策略效果較好,不同步效率和rdb相同

3.10.總結(jié)

總結(jié)

性能建議:

性能建議

文集推薦:

Java基礎(chǔ)方法集1
Python基礎(chǔ)知識(shí)完整版
Spring Boot學(xué)習(xí)筆記
Linux指令進(jìn)階
Java高并發(fā)編程
SpringMVC基礎(chǔ)知識(shí)進(jìn)階
Mysql基礎(chǔ)知識(shí)完整版
健康管理系統(tǒng)學(xué)習(xí)花絮(學(xué)習(xí)記錄)
Node.js基礎(chǔ)知識(shí)(隨手筆記)
MongoDB基礎(chǔ)知識(shí)
Dubbo學(xué)習(xí)筆記
Vue學(xué)習(xí)筆記(隨手筆記)

聲明:發(fā)表此文是出于傳遞更多信息之目的。若有來(lái)源標(biāo)注錯(cuò)誤或侵犯了您的合法權(quán)益,請(qǐng)作者持權(quán)屬證明與本我們(QQ:981086665;郵箱:981086665@qq.com)聯(lián)系聯(lián)系,我們將及時(shí)更正、刪除,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Redis高可用概述 在介紹Redis高可用之前,先說(shuō)明一下在Redis的語(yǔ)境中高可用的含義。 我們知道,在w...
    空語(yǔ)閱讀 1,678評(píng)論 0 2
  • 企業(yè)級(jí)redis集群架構(gòu)的特點(diǎn) 海量數(shù)據(jù) 高并發(fā) 高可用 要達(dá)到高可用,持久化是不可減少的,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,280評(píng)論 0 7
  • 本文檔翻譯自http://redis.io/topics/persistence。 這篇文章提供了 Redis 持...
    daos閱讀 736評(píng)論 0 10
  • 兩只手套 我有一副手套,軟皮的,質(zhì)地非常好,天冷,我放車門夾層,隨時(shí)用。 前幾...
    華益益閱讀 528評(píng)論 0 5
  • 這只是簡(jiǎn)短的記錄一下此時(shí)此刻的心情。 有時(shí)候會(huì)不會(huì)突然很想脫單呢?是因?yàn)榧拍瘑??還是真的遇上了喜歡的人?有人說(shuō),一...
    攸然似我閱讀 229評(píng)論 0 0

友情鏈接更多精彩內(nèi)容