概述
- RDB是基于定時(shí)更新生成內(nèi)存快照的方式持久化碍沐,快照里存儲(chǔ)的所有數(shù)據(jù)的最終態(tài)的數(shù)據(jù),比如 age:30
- AOF是基于狀態(tài)機(jī)+命令日志+日志壓縮的方式實(shí)現(xiàn)持久化(類似于Zookeeper狀態(tài)機(jī)機(jī)制)政敢,日志里面存儲(chǔ)的是過(guò)程態(tài)的操作日志乏奥,比如 操作1
age:10
谱煤,操作2age:20
,操作3age:30
- 用戶可以關(guān)閉Redis持久化的功能嘉抓,也可以AOF索守、 RDB一起使用(restart時(shí)會(huì)根據(jù)AOF重建內(nèi)存狀態(tài))
AOF更適合精準(zhǔn)、海量數(shù)據(jù):數(shù)據(jù)完整性要求嚴(yán)格抑片、大數(shù)據(jù)存儲(chǔ)量卵佛、人工可追溯的業(yè)務(wù)場(chǎng)景
RDB更適合運(yùn)維方便:節(jié)省硬盤(pán)空間、更方便數(shù)據(jù)備份和恢復(fù)
rdb 定時(shí)快照持久化
- 優(yōu)點(diǎn):
- 定時(shí)生成一個(gè)高度壓縮的二進(jìn)制文件敞斋,容易備份和恢復(fù)
- 相比于AOF機(jī)制截汪,如果數(shù)據(jù)集很大,RDB的啟動(dòng)效率會(huì)更高,因?yàn)榭煺沾鎯?chǔ)的是一個(gè)最終態(tài)的數(shù)據(jù)植捎,而不是過(guò)程態(tài)的數(shù)據(jù)
- 缺點(diǎn):
- 數(shù)據(jù)不是百分百安全衙解,未持久化的數(shù)據(jù)可能會(huì)丟失
- 當(dāng)內(nèi)存中的數(shù)據(jù)特別大的時(shí)候,因?yàn)槊看味际巧梢粋€(gè)完整的快照文件焰枢,速度會(huì)很慢蚓峦,而AOF只有在日志壓縮的時(shí)候才會(huì)面臨這個(gè)問(wèn)題
- 工作原理
- 將Reids在內(nèi)存中的數(shù)據(jù)庫(kù)記錄定時(shí) dump到磁盤(pán)上的RDB持久化,
- 正常退出會(huì)執(zhí)行一次生成快照济锄,但是kill進(jìn)程的方式則不會(huì)觸發(fā)退出時(shí)生成快照
實(shí)際操作過(guò)程是fork一個(gè)子進(jìn)程暑椰,先將數(shù)據(jù)集寫(xiě)入臨時(shí)文件,寫(xiě)入成功后荐绝,再替換之前的文件一汽,用二進(jìn)制壓縮存儲(chǔ)。 - save 900 1 #在900秒(15分鐘)之后很泊,如果至少有1個(gè)key發(fā)生變化角虫,則dump內(nèi)存快照。
- save 300 10 #在300秒(5分鐘)之后委造,如果至少有10個(gè)key發(fā)生變化戳鹅,則dump內(nèi)存快照。
- save 60 10000 #在60秒(1分鐘)之后昏兆,如果至少有10000個(gè)key發(fā)生變化枫虏,則dump內(nèi)存快照。
- RDB配置
redis.conf (記得啟動(dòng)的時(shí)候要指定這個(gè)配置文件 windows 下 ./redis-server.exe redis.conf)
# 設(shè)置10秒內(nèi)如果改動(dòng)達(dá)到3個(gè)就生成一個(gè)快照
save 10 3
rdbcompression yes
rdbchecksum yes
# 設(shè)置二進(jìn)制快照的名字
dbfilename dumpTest.rdb
# 設(shè)置快照文件的路徑
dir ./
AOF(append only file)
內(nèi)部機(jī)制類似于zab:狀態(tài)機(jī)+命令日志的形式
以日志的形式記錄服務(wù)器所處理的每一個(gè)寫(xiě)、刪除操作隶债,查詢操作不會(huì)記錄腾它,以文本的方式記錄,可以打開(kāi)文件看到詳細(xì)的操作記錄死讹。
- appendfsync always #每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫(xiě)入AOF文件瞒滴。
- appendfsync everysec #每秒鐘同步一次,該策略為AOF的缺省策略赞警。
- appendfsync no #從不同步妓忍。高效但是數(shù)據(jù)不會(huì)被持久化
- 具體配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync always
#配置當(dāng) AOF 文件需要比舊 AOF 文件增大多少時(shí)才進(jìn)行 AOF 重寫(xiě),默認(rèn)和舊AOF文本大小
auto-aof-rewrite-percentage 100
#當(dāng) AOF 文件需要達(dá)到多大體積時(shí)才進(jìn)行 AOF 重寫(xiě)
auto-aof-rewrite-min-size 64mb
- 優(yōu)點(diǎn):
- AOF包含一個(gè)格式清晰愧旦、易于理解的日志文件用于記錄所有的修改操作世剖。事實(shí)上,我們也可以通過(guò)該文件完成數(shù)據(jù)的重建笤虫,而RDB是二進(jìn)制文件
- 數(shù)據(jù)集文件過(guò)大會(huì)自動(dòng)啟用rewrite機(jī)制旁瘫。即Redis以append模式不斷的將修改數(shù)據(jù)寫(xiě)入到老的磁盤(pán)文件中,同時(shí)Redis還會(huì)創(chuàng) 建一個(gè)新的文件用于記錄此期間有哪些修改命令被執(zhí)行琼蚯。因此在進(jìn)行rewrite切換時(shí)可以更好的保證數(shù)據(jù)安全性
- AOF 文件的格式可讀性較強(qiáng)酬凳,這也為使用者提供了更靈活的處理方式。例如凌停,如果我們不小心錯(cuò)用了 FLUSHALL 命令粱年,在重寫(xiě)還沒(méi)進(jìn)行時(shí),我們可以手工將最后的 FLUSHALL 命令去掉罚拟,然后再使用 AOF 來(lái)恢復(fù)數(shù)據(jù)
- 缺點(diǎn)
- 大存儲(chǔ)數(shù)據(jù)的時(shí)候重啟的時(shí)候台诗,加載速度比RDB要慢,但是因?yàn)槭亲芳犹砑尤罩荆淮嬖谏纱罂煺盏目D的情況出現(xiàn)
- 相對(duì)于RDB的方式赐俗,相同的數(shù)據(jù)量AOF占用的空間更大
- 重寫(xiě)機(jī)制
- aof里存放了所有的redis 操作指令拉队,當(dāng)aof文件達(dá)到一定條件或者手動(dòng)bgrewriteaof命令都可以觸發(fā)rewrite
- rewrite之后aof文件會(huì)保存keys的最后的狀態(tài),清除掉之前冗余的阻逮,來(lái)縮小這個(gè)文件
- 重寫(xiě)時(shí)機(jī):兩個(gè)幾乎都滿足的時(shí)候才出發(fā)粱快,比如最開(kāi)始size為1kb,到了2kb不觸發(fā)叔扼,至于到了64mb的時(shí)候才觸發(fā)第一次
Expire過(guò)期機(jī)制
刪除過(guò)期鍵對(duì)象事哭,由于內(nèi)存中保存了大量的鍵,維護(hù)鍵精準(zhǔn)的過(guò)期刪除機(jī)制會(huì)導(dǎo)致消耗大量的CPU瓜富,對(duì)于單線程的Redis來(lái)說(shuō)成本過(guò)高鳍咱,因此,Redis采用惰性刪除和定時(shí)任務(wù)刪除機(jī)制來(lái)實(shí)現(xiàn)過(guò)期鍵的內(nèi)存回收与柑。
惰性刪除:惰性刪除用于當(dāng)client端讀取到帶有超時(shí)屬性的鍵時(shí)谤辜,如果已經(jīng)超過(guò)鍵設(shè)置的過(guò)期時(shí)間蓄坏,會(huì)執(zhí)行刪除操作并返回空,該策略是出于節(jié)省CPU成本考慮丑念,不需要單獨(dú)維護(hù)TTL鏈表來(lái)處理過(guò)期鍵的刪除涡戳。該方式存在內(nèi)存泄漏的可能,當(dāng)過(guò)期鍵一直沒(méi)有訪問(wèn)將無(wú)法得到及時(shí)刪除脯倚,從而導(dǎo)致內(nèi)存不能及時(shí)釋放渔彰。
定時(shí)任務(wù)刪除:Redis內(nèi)部維護(hù)一個(gè)定時(shí)任務(wù),默認(rèn)每秒運(yùn)行10次推正,定時(shí)任務(wù)中刪除過(guò)期鍵邏輯采用了自適應(yīng)算法胳岂,根據(jù)鍵的過(guò)期比例,使用快慢兩種速率模式回收鍵舔稀。
內(nèi)存溢出策略
當(dāng)Redis所用內(nèi)存達(dá)到maxmemory上限時(shí)會(huì)觸發(fā)相應(yīng)的溢出控制策略,策略由maxmemory-policy參數(shù)控制掌测,可以通過(guò)config set maxmemory-policy {policy} 動(dòng)態(tài)設(shè)置内贮。
LRU就是 least Recent Use,根據(jù)最近最少使用的
noeviction:默認(rèn)策略汞斧,不會(huì)刪除任何數(shù)據(jù)夜郁,拒絕所有寫(xiě)入操作并返回client端OOM錯(cuò)誤信息,此時(shí)Redis只響應(yīng)讀操作粘勒;
allkeys-lru:根據(jù)LRU算法刪除鍵竞端,不管數(shù)據(jù)有沒(méi)有設(shè)置超時(shí)時(shí)間,直到釋放足夠的內(nèi)存空間為止庙睡;
allkeys-random:隨機(jī)刪除所有鍵事富,直到釋放足夠的內(nèi)存空間為止;
volatile-lru:根據(jù)LRU算法刪除設(shè)置了超時(shí)屬性的鍵乘陪,直到釋放足夠空間為止统台,如果沒(méi)有可刪除的鍵對(duì)象,回退到noeviction策略啡邑;
volatile-random:隨機(jī)刪除過(guò)期鍵贱勃,直到釋放足夠的內(nèi)存空間為止;
volatile-ttl:根據(jù)鍵對(duì)象的ttl屬性谤逼,刪除最近將要過(guò)期的數(shù)據(jù)贵扰,如果沒(méi)有,回退到noeviction策略
參考
官網(wǎng)講的很詳細(xì)了
https://redis.io/topics/persistence#snapshotting
https://blog.csdn.net/guweiyu_thinker/article/details/78816071