持久化概述
持久化可以理解為存儲(chǔ),就是將數(shù)據(jù)存儲(chǔ)到一個(gè)不會(huì)丟失的地方,如果把數(shù)據(jù)放在內(nèi)存中,電腦關(guān)閉或重啟數(shù)據(jù)就會(huì)丟失,所以放在內(nèi)存中的數(shù)據(jù)不是持久化的,而放在磁盤(pán)就算是一種持久化。
Redis 的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,內(nèi)存是瞬時(shí)的,如果 linux 宕機(jī)或重啟,又或者 Redis 崩潰或重啟,所有的內(nèi)存數(shù)據(jù)都會(huì)丟失,為解決這個(gè)問(wèn)題,Redis 提供兩種機(jī)制對(duì)數(shù)據(jù)進(jìn)行持久化存儲(chǔ),便于發(fā)生故障后能迅速恢復(fù)數(shù)據(jù)。
● RDB 方式
A、什么是 RDB 方式?
Redis Database(RDB),就是在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫(xiě)入磁盤(pán),數(shù)據(jù)恢復(fù)時(shí)將快照文件直接再讀到內(nèi)存。
RDB 保存了在某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)集(全部數(shù)據(jù))。存儲(chǔ)在一個(gè)二進(jìn)制文件中,只有一個(gè)文件。默認(rèn)是 dump.rdb。RDB 技術(shù)非常適合做備份,可以保存最近一個(gè)小時(shí),一天,一個(gè)月的全部數(shù)據(jù)。保存數(shù)據(jù)是在單獨(dú)的進(jìn)程中寫(xiě)文件,不影響 Redis 的正常使用。RDB 恢復(fù)數(shù)據(jù)時(shí)比其他 AOF 速度快。
B、 如何實(shí)現(xiàn)?
RDB 方式的數(shù)據(jù)持久化,僅需在 redis.conf 文件中配置即可,默認(rèn)配置是啟用的。
在配置文件 redis.conf 中搜索 SNAPSHOTTING, 查找在注釋開(kāi)始和結(jié)束之間的關(guān)于 RDB的配置說(shuō)明。配 SNAPSHOTTING 置地方有三處。
①:配置執(zhí)行 RDB 生成快照文件的時(shí)間策略。
對(duì) Redis 進(jìn)行設(shè)置, 讓它在“ N 秒內(nèi)數(shù)據(jù)集至少有 M 個(gè) key 改動(dòng)”這一條件被滿(mǎn)足時(shí), 自動(dòng)保存一次數(shù)據(jù)集。
配置格式:save <seconds> <changes> save 900 1
save 300 10
save 60 10000
②:dbfilename:設(shè)置 RDB 的文件名,默認(rèn)文件名為 dump.rdb
③:dir:指定 RDB 文件的存儲(chǔ)位置,默認(rèn)是 ./ 當(dāng)前目錄
配置步驟:
①:查看 ps -ef | grep redis ,如果 redis 服務(wù)啟動(dòng),先停止。
②:修改 redis.conf 文件, 修改前先備份,執(zhí)行 cp redis.conf bak_redis.conf
查看默認(rèn)啟用的 RDB 文件
③:編輯 redis.conf 增加 save 配置, 修改文件名等。vim redis.conf
修改的內(nèi)容:
把原來(lái)的默認(rèn)的 dump.rdb 刪除,修改 redis.conf 后,重新啟動(dòng) redis
④:在 20 秒內(nèi)容,修改三個(gè) key 的值
⑤:查看生成的 rdb 文件
C、 總結(jié)
優(yōu)點(diǎn):由于存儲(chǔ)的是數(shù)據(jù)快照文件,恢復(fù)數(shù)據(jù)很方便,也比較快缺點(diǎn):
1)會(huì)丟失最后一次快照以后更改的數(shù)據(jù)。如果你的應(yīng)用能容忍一定數(shù)據(jù)的丟失,那么使用 rdb 是不錯(cuò)的選擇;如果你不能容忍一定數(shù)據(jù)的丟失,使用 rdb 就不是一個(gè)很好的選擇。
2)由于需要經(jīng)常操作磁盤(pán),RDB 會(huì)分出一個(gè)子進(jìn)程。如果你的 redis 數(shù)據(jù)庫(kù)很大的話(huà), 子進(jìn)程占用比較多的時(shí)間,并且可能會(huì)影響 Redis 暫停服務(wù)一段時(shí)間(millisecond 級(jí)別),如果你的數(shù)據(jù)庫(kù)超級(jí)大并且你的服務(wù)器 CPU 比較弱,有可能是會(huì)達(dá)到一秒。
● AOF 方式
A、什么是 AOF 方式
Append-only File(AOF),Redis 每次接收到一條改變數(shù)據(jù)的命令時(shí),它將把該命令寫(xiě)到一個(gè) AOF 文件中(只記錄寫(xiě)操作,讀操作不記錄),當(dāng) Redis 重啟時(shí),它通過(guò)執(zhí)行 AOF 文件中所有的命令來(lái)恢復(fù)數(shù)據(jù)。
B、 如何實(shí)現(xiàn)
AOF 方式的數(shù)據(jù)持久化,僅需在 redis.conf 文件中配置即可配置項(xiàng):
①:appendonly:默認(rèn)是 no,改成 yes 即開(kāi)啟了 aof 持久化
②:appendfilename:指定 AOF 文件名,默認(rèn)文件名為 appendonly.aof
③:dir : 指定 RDB 和 AOF 文件存放的目錄,默認(rèn)是 ./
④:appendfsync:配置向 aof 文件寫(xiě)命令數(shù)據(jù)的策略:
no:不主動(dòng)進(jìn)行同步操作,而是完全交由操作系統(tǒng)來(lái)做(即每 30 秒一次),比較快但不是很安全。
always:每次執(zhí)行寫(xiě)入都會(huì)執(zhí)行同步,慢一些但是比較安全。
everysec:每秒執(zhí)行一次同步操作,比較平衡,介于速度和安全之間。這是默認(rèn)項(xiàng)。
⑤:auto-aof-rewrite-min-size:允許重寫(xiě)的最小 AOF 文件大小,默認(rèn)是 64M 。當(dāng) aof 文件大于 64M 時(shí),開(kāi)始整理 aop 文件, 去掉無(wú)用的操作命令??s小 aop 文件。
例 1:
①:停止運(yùn)行的 redis , 備份要修改的 redis.conf
②:查看 redis 安裝目錄/src 下有無(wú) .aof 文件。 默認(rèn)是在 redis 的當(dāng)前目錄
③:編輯 redis.conf
設(shè)置 appendonly 為 yes 即可。
查看 appendfsync 的當(dāng)前策略。
查看 appendfilname 的文件名稱(chēng)
④:在 redis 客戶(hù)端執(zhí)行 寫(xiě)入命令
⑤ 查看 aof 文件
● 總結(jié)
append-only 文件是另一個(gè)可以提供完全數(shù)據(jù)保障的方案;
2.AOF 文件會(huì)在操作過(guò)程中變得越來(lái)越大。比如,如果你做一百次加法計(jì)算,最后你只會(huì)在數(shù)據(jù)庫(kù)里面得到最終的數(shù)值,但是在你的 AOF 里面會(huì)存在 100 次記錄,其中 99 條記錄對(duì)最終的結(jié)果是無(wú)用的;但 Redis 支持在不影響服務(wù)的前提下在后臺(tái)重構(gòu) AOF 文件,讓文件得以整理變小
3.可以同時(shí)使用這兩種方式,redis 默認(rèn)優(yōu)先加載 aof 文件(aof 數(shù)據(jù)最完整);