前言
Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)畦浓。Redis為了保證效率痹束,數(shù)據(jù)緩存在內(nèi)存中,但是為了保證數(shù)據(jù)可靠性宅粥,Redis也支持將內(nèi)存中的數(shù)據(jù)同步到磁盤保證持久化参袱。
Redis支持兩種數(shù)據(jù)持久化方式:RDB方式和AOF方式。前者會(huì)根據(jù)配置的規(guī)則定時(shí)將內(nèi)存中的數(shù)據(jù)寫入到磁盤秽梅,后者則是以追加寫的方式將修改刪除操作寫入到記錄文件中。兩種持久化方式可以單獨(dú)使用剿牺,但是通常會(huì)將兩者結(jié)合使用企垦。
Redis的持久化策略:2種
- RDB:快照形式是直接把內(nèi)存中的數(shù)據(jù)保存到一個(gè) dump 文件中,定時(shí)保存晒来,Redis的默認(rèn)保存策略钞诡。
- AOF:把所有的對(duì)Redis的服務(wù)器進(jìn)行修改的命令都存到一個(gè)文件里,命令的集合湃崩。
Redis默認(rèn)只開(kāi)啟快照RDB的持久化方式荧降。
當(dāng) Redis 重啟時(shí),它會(huì)優(yōu)先使用 AOF 文件來(lái)還原數(shù)據(jù)集攒读,因?yàn)?AOF 文件保存的數(shù)據(jù)集通常比 RDB 文件所保存的數(shù)據(jù)集更完整朵诫。你甚至可以關(guān)閉持久化功能,讓數(shù)據(jù)只在服務(wù)器運(yùn)行時(shí)保存薄扁。
正文
RDB持久化
原理分析
默認(rèn) Redis 是會(huì)以快照 “RDB” 的形式將數(shù)據(jù)持久化到磁盤的剪返,一個(gè)二進(jìn) 制文件,dump.rdb邓梅。
工作原理簡(jiǎn)單介紹一下:當(dāng) Redis 需要做持久化時(shí)脱盲,Redis 會(huì) fork 一個(gè)子進(jìn)程,子進(jìn)程將數(shù)據(jù)寫到磁盤上一個(gè)臨時(shí) RDB 文件中日缨。當(dāng)子進(jìn)程完成寫臨時(shí)文件后钱反,將原來(lái)的 RDB 替換掉,這樣的好處就是可以 copy-on-write。
Redis默認(rèn)情況下面哥,是快照 RDB 的持久化方式哎壳,將內(nèi)存中的數(shù)據(jù)以快照的方式寫入二進(jìn)制文件中,默認(rèn)的文件名是 dump.rdb 幢竹。當(dāng)然我們也可以手動(dòng)執(zhí)行 save 或者 bgsave(異步)做快照耳峦。
Redis.conf配置 :默認(rèn)是如下配置
save 900 1
save 300 10
save 60 10000
- 900秒之內(nèi),如果超過(guò)1個(gè)key被修改焕毫,則發(fā)起快照保存蹲坷;
- 300秒內(nèi),如果超過(guò)10個(gè)key被修改邑飒,則發(fā)起快照保存循签;
- 1分鐘之內(nèi),如果1萬(wàn)個(gè)key被修改疙咸,則發(fā)起快照保存县匠;
優(yōu)缺點(diǎn)分析
RDB 的優(yōu)點(diǎn)
這種文件非常適合用于進(jìn)行備份: 比如說(shuō),你可以在最近的 24 小時(shí)內(nèi)撒轮,每小時(shí)備份一次 RDB 文件乞旦,并且在每個(gè)月的每一天,也備份一個(gè) RDB 文件题山。 這樣的話兰粉,即使遇上問(wèn)題,也可以隨時(shí)將數(shù)據(jù)集還原到不同的版本顶瞳。RDB 非常適用于災(zāi)難恢復(fù)(disaster recovery)玖姑。
RDB 的缺點(diǎn):
如果你需要盡量避免在服務(wù)器故障時(shí)丟失數(shù)據(jù),那么 RDB 不適合你慨菱。 雖然 Redis 允許你設(shè)置不同的保存點(diǎn)(save point)來(lái)控制保存 RDB 文件的頻率焰络, 但是, 因?yàn)镽DB 文件需要保存整個(gè)數(shù)據(jù)集的狀態(tài)符喝, 所以它并不是一個(gè)輕松的操作闪彼。 因此你可能會(huì)至少 5 分鐘才保存一次 RDB 文件。 在這種情況下洲劣, 一旦發(fā)生故障停機(jī)备蚓, 你就可能會(huì)丟失好幾分鐘的數(shù)據(jù)。
AOF(append only file)持久化
使用 AOF 做持久化囱稽,每一個(gè)寫命令都通過(guò)write函數(shù)追加到 appendonly.aof
中郊尝,配置方式:?jiǎn)?dòng) AOF 持久化的方式
Redis.conf配置
appendfsync yes
appendfsync always #每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫入AOF文件。
appendfsync everysec #每秒鐘同步一次战惊,該策略為AOF的缺省策略流昏。
AOF 就可以做到全程持久化,只需要在配置文件中開(kāi)啟(默認(rèn)是no),appendonly yes開(kāi)啟 AOF 之后况凉,Redis 每執(zhí)行一個(gè)修改數(shù)據(jù)的命令谚鄙,都會(huì)把它添加到 AOF 文件中,當(dāng) Redis 重啟時(shí)刁绒,將會(huì)讀取 AOF 文件進(jìn)行“重放”以恢復(fù)到 Redis 關(guān)閉前的最后時(shí)刻闷营。
AOF優(yōu)缺點(diǎn)分析
AOF 的優(yōu)點(diǎn)
使用 AOF 持久化會(huì)讓 Redis 變得非常耐久(much more durable):你可以設(shè)置不同的 fsync 策略,比如無(wú) fsync 知市,每秒鐘一次 fsync 傻盟,或者每次執(zhí)行寫入命令時(shí) fsync 。 AOF 的默認(rèn)策略為每秒鐘 fsync 一次嫂丙,在這種配置下娘赴,Redis 仍然可以保持良好的性能,并且就算發(fā)生故障停機(jī)跟啤,也最多只會(huì)丟失一秒鐘的數(shù)據(jù)( fsync 會(huì)在后臺(tái)線程執(zhí)行诽表,所以主線程可以繼續(xù)努力地處理命令請(qǐng)求)。
AOF 的缺點(diǎn)
對(duì)于相同的數(shù)據(jù)集來(lái)說(shuō)隅肥,AOF 文件的體積通常要大于 RDB 文件的體積竿奏。根據(jù)所使用的 fsync 策略,AOF 的速度可能會(huì)慢于 RDB腥放。 在一般情況下议双, 每秒 fsync 的性能依然非常高, 而關(guān)閉 fsync 可以讓 AOF 的速度和 RDB 一樣快捉片, 即使在高負(fù)荷之下也是如此。 不過(guò)在處理巨大的寫入載入時(shí)汞舱,RDB 可以提供更有保證的最大延遲時(shí)間(latency)
如何選擇
如果你非常關(guān)心你的數(shù)據(jù),但仍然可以承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失伍纫, 那么你可以只使用 RDB 持久。
AOF 將 Redis 執(zhí)行的每一條命令追加到磁盤中昂芜,處理巨大的寫入會(huì)降低 Redis 的性能莹规,不知道你是否可以接受。
數(shù)據(jù)庫(kù)備份和災(zāi)難恢復(fù):定時(shí)生成 RDB 快照(snapshot)非常便于進(jìn)行數(shù)據(jù)庫(kù)備份泌神, 并且 RDB 恢復(fù)數(shù)據(jù)集的速度也要比 AOF 恢復(fù)的速度要快良漱。
Redis 支持同時(shí)開(kāi)啟 RDB 和 AOF,系統(tǒng)重啟后,Redis 會(huì)優(yōu)先使用 AOF 來(lái)恢復(fù)數(shù)據(jù)欢际,這樣丟失的數(shù)據(jù)會(huì)最少母市。