redis作為一個(gè)內(nèi)存數(shù)據(jù)庫(kù) 高QPS每秒查詢率(Query Per Second) 是它的特點(diǎn)呈枉。
它的數(shù)據(jù)持久化有兩種策略场躯。
1疤祭、RDB
2、AOF
RDB的特性如下:
fork一個(gè)進(jìn)程茵瘾,遍歷hash table礼华,利用copy on write,把整個(gè)db dump保存下來(lái)拗秘。
save, shutdown, slave 命令會(huì)觸發(fā)這個(gè)操作圣絮。
粒度比較大,如果save, shutdown, slave 之前crash了雕旨,則中間的操作沒(méi)辦法恢復(fù)扮匠。
AOF有如下特性:
把寫操作指令,持續(xù)的寫到一個(gè)類似日志文件里凡涩。(類似于從postgresql等數(shù)據(jù)庫(kù)導(dǎo)出sql一樣棒搜,只記錄寫操作)
粒度較小,crash之后活箕,只有crash之前沒(méi)有來(lái)得及做日志的操作沒(méi)辦法恢復(fù)力麸。
具體配置:
在redis.conf的配置文件中,應(yīng)當(dāng)視需求適當(dāng)配置redis
RDB的配置相關(guān)
################################ SNAPSHOTTING ################################
1、save指令觸發(fā)的條件
save 900 1 #15分鐘有一個(gè)key修改就觸發(fā)save
save 300 10 #5分鐘有十個(gè)key修改就觸發(fā)save
save 60 10000 #1分鐘有一萬(wàn)個(gè)key修改就觸發(fā)save
2育韩、stop-writes-on-bgsave-error yes/no (默認(rèn)值為yes)
即當(dāng)bgsave快照操作出錯(cuò)時(shí)停止寫數(shù)據(jù)到磁盤末盔,這樣后面寫錯(cuò)做均會(huì)失敗,為了不影響后續(xù)寫操作座慰,故需將該項(xiàng)值改為no
3陨舱、rdbcompression yes/no
指定存儲(chǔ)至本地?cái)?shù)據(jù)庫(kù)時(shí)是否壓縮數(shù)據(jù),默認(rèn)是yes版仔,redis采用LZF壓縮游盲,如果為了節(jié)省CPU時(shí)間可以改成no 但會(huì)導(dǎo)致數(shù)據(jù)庫(kù)文件扁的巨大
4、rdbchecksum yes/no
對(duì)rdb數(shù)據(jù)進(jìn)行校驗(yàn),耗費(fèi)CPU資源,默認(rèn)為yes
5蛮粮、dbfilename dump.rdb
備份文件名稱
6益缎、dir ./
備份文件存放的地址
AOF 配置相關(guān)
############################## APPEND ONLY MODE ###############################
1、appendonly yes/no
是否開啟AOF的持久化方式
2然想、appendfilename "appendonly.aof"
備份文件的名稱
3莺奔、備份規(guī)則
appendfsync always #每次寫一條記錄都會(huì)備份到日志中寫道磁盤上。性能會(huì)降低很多 但是可以確保記錄不丟失
appendfsync everysec #每一秒鐘將OS cache中的數(shù)據(jù)fsync到磁盤上变泄。性能比較好令哟。建議使用的規(guī)則
appendfsync no #只把數(shù)據(jù)寫道os cache ,與操作系統(tǒng)來(lái)決定什么時(shí)候同步到磁盤妨蛹。性能最高屏富。但是不確定什么時(shí)候持久化大磁盤。不可控蛙卤。
4狠半、no-appendfsync-on-rewrite yes/no 一般為了保證數(shù)據(jù)完整不丟失都會(huì)設(shè)置為no
因?yàn)榉?wù)器的內(nèi)存有限噩死,redis可以存放的數(shù)據(jù)也是有限的。有些數(shù)據(jù)可能會(huì)自動(dòng)過(guò)期 或者別操作刪除掉神年,
但是寫日志并沒(méi)有被清理掉已维。導(dǎo)致這些數(shù)據(jù)會(huì)被恢復(fù)或者aof的文件會(huì)越來(lái)越大。
redis為了處理這個(gè)問(wèn)題會(huì)每隔一段時(shí)間在后臺(tái)基于當(dāng)前redis中的數(shù)據(jù)重新寫一次aof日志文件已日,覆蓋之前的文件垛耳。
rewritef操作和主進(jìn)程寫aof文件的操作,兩者都會(huì)操作磁盤捂敌,而bgrewriteaof往往會(huì)涉及大量磁盤操作艾扮,這樣就會(huì)造成主進(jìn)程在寫aof文件的時(shí)候出現(xiàn)阻塞的情形,現(xiàn)在no-appendfsync-on-rewrite參數(shù)出場(chǎng)了占婉。
如果該參數(shù)設(shè)置為no泡嘴,是最安全的方式,不會(huì)丟失數(shù)據(jù)逆济,但是要忍受阻塞的問(wèn)題酌予。如果設(shè)置為yes呢?這就相當(dāng)于將appendfsync設(shè)置為no奖慌,這說(shuō)明并沒(méi)有執(zhí)行磁盤操作抛虫,只是寫入了緩沖區(qū),因此這樣并不會(huì)造成阻塞(因?yàn)闆](méi)有競(jìng)爭(zhēng)磁盤)简僧,但是如果這個(gè)時(shí)候redis掛掉建椰,就會(huì)丟失數(shù)據(jù)。丟失多少數(shù)據(jù)呢岛马?在linux的操作系統(tǒng)的默認(rèn)設(shè)置下棉姐,最多會(huì)丟失30s的數(shù)據(jù)。
5啦逆、auto-aof-rewrite-percentage 100
aof文件增長(zhǎng)比例伞矩,指當(dāng)前aof文件比上次重寫的增長(zhǎng)比例大小。aof重寫即在aof文件在一定大小之后夏志,重新將整個(gè)內(nèi)存寫到aof文件當(dāng)中乃坤,。這樣就避免了沟蔑,aof文件過(guò)大而實(shí)際內(nèi)存數(shù)據(jù)小的問(wèn)題(頻繁修改數(shù)據(jù)問(wèn)題).
6湿诊、auto-aof-rewrite-min-size 64mb
aof文件重寫最小的文件大小,即最開始aof文件必須要達(dá)到這個(gè)文件大小時(shí)才觸發(fā)溉贿,后面的每次重寫就不會(huì)根據(jù)這個(gè)變量了(根據(jù)上一次重寫完成之后的大小).此變量?jī)H初始化啟動(dòng)redis有效.如果是redis恢復(fù)時(shí)枫吧,則lastSize等于初始aof文件大小.
7、aof-load-truncated yes/no
指redis在恢復(fù)時(shí)宇色,會(huì)忽略最后一條可能存在問(wèn)題的指令。默認(rèn)值yes。即在aof寫入時(shí)宣蠕,可能存在指令寫錯(cuò)的問(wèn)題(突然斷電例隆,寫了一半),這種情況下抢蚀,yes會(huì)log并繼續(xù)镀层,而no會(huì)直接恢復(fù)失敗.
如果 RDB 和AOF 同時(shí)工作
1.如果RDB在執(zhí)行snapshotting操作,那AOF不會(huì)rewrite皿曲。如果AOF不會(huì)rewrite唱逢,那RDB不會(huì)進(jìn)行snapshotting操作。
2.RDB在執(zhí)行snapshotting操作屋休,如果用戶執(zhí)行了rewrite aof的命令坞古, 那redis會(huì)在RDB執(zhí)行完成后在執(zhí)行rewrite。
3.如果有RDB snapshot文件 和AOF 日志同時(shí)存在劫樟,redis在恢復(fù)數(shù)據(jù)的時(shí)候默認(rèn)使用aof痪枫,因?yàn)槿罩靖暾?/p>
如果AOF的文件受損了
執(zhí)行 redis-check-aof --fix 來(lái)修復(fù)受損的aof文件