前言
Redis持久化,一個老掉牙的問題,但是面試官就是喜歡問。這也是我們學(xué)Redis必會的一個知識點(diǎn)。Redis作為內(nèi)存數(shù)據(jù)庫,它工作時,數(shù)據(jù)都保存在內(nèi)存里,這也是它為什么很快的一個原因。但存到內(nèi)存里肯定是有丟數(shù)據(jù)的風(fēng)險,所以Redis是有設(shè)計(jì)持久化的。Redis持久化分為兩種:RDB和AOF。
RDB持久化
RDB(Redis DataBase),是redis默認(rèn)的存儲方式,RDB持久化其實(shí)就是將內(nèi)存的數(shù)據(jù)直接做了一份快照到磁盤上。觸發(fā)RDB持久化的方式有:
符合配置的快照保存規(guī)則(配置文件里save開頭的配置);
執(zhí)行save或者bgsave命令;
執(zhí)行flushall命令;
執(zhí)行主從復(fù)制操作 (第一次)。
配置文件redis.conf中,save開頭的配置為RDB持久化相關(guān)配置。具體解釋如下:
save "" 表示關(guān)閉rdb持久化;
save 3600 1 表示每1小時至少有1個key改變,就觸發(fā)一次持久化可以寫多個條件;
save 3600 1 300 100 60 10000 這里定義了三個策略,它們相互之間為或的關(guān)系。
AOF持久化
AOF(AppendOnly File)持久化,是其將Reids執(zhí)行過的所有寫指令記錄下來,保存到日志里,類似MySQL的bin-log。默認(rèn)配置文件里該持久化方式是關(guān)閉的,需要將配置修改為:
appendonly yes由于AOF是將Redis服務(wù)的寫操作日志寫到日志文件里,當(dāng)寫操作非常頻繁時,那么它對磁盤也會造成很大的壓力。所以,AOF的磁盤數(shù)據(jù)落地(fsync函數(shù))也有三個策略: Always:表示只要有寫入就會調(diào)用fsync函數(shù); Everysec:表示每秒調(diào)用fsync函數(shù)一次; No:表示不調(diào)用fscyn函數(shù),完全跟著系統(tǒng)走;
建議選擇everysec,比較保守一些。
AOF重寫
AOF文件如果不做干預(yù),它會一直增漲,直到將你的磁盤寫滿。好在Redis給AOF提供了重寫機(jī)制。我們可以直接執(zhí)行如下命令,進(jìn)行AOF重寫:
bgrewriteaof;執(zhí)行完該命令后,AOF文件會根據(jù)已經(jīng)持久化的RDB文件和現(xiàn)有AOF文件重新整理,它會把無用的寫日志清空,最終達(dá)到瘦身目的。 當(dāng)然,AOF還有一個重寫的配置,兩個參數(shù):
參數(shù) | 說明 |
auto-aof-rewrite-min-size | AOF文件必須要不低于這個尺寸時才會觸發(fā)重寫,后面的每次重寫就不會根據(jù)這個變量了(根據(jù)上一次重寫完成之后的大小)。此變量僅初始化啟動redis有效 |
auto-aof-rewrite-percentage | 如果該數(shù)值定義為80,則表示當(dāng)AOF文件增長的尺寸超過上次大?。ˋOF文件上次重寫后的大小會被記錄下來)百分80時就會觸發(fā)重寫操作 |
RDB和AOF如何選
在實(shí)際生產(chǎn)環(huán)境中,根據(jù)數(shù)據(jù)量、應(yīng)用對數(shù)據(jù)的安全要求、預(yù)算限制等不同情況,會有各種各樣的持久化策略。 如,完全不使用任何持久化、使用RDB持久化或AOF持久化的一種,或同時開啟快照持久化和AOF持久化等。此外,持久化的選擇必須與Redis的主從策略一起考慮,因?yàn)橹鲝膹?fù)制與持久化同樣具有數(shù)據(jù)備份的功能,而且主機(jī)Master和從機(jī)Slave可以獨(dú)立的選擇持久化方案。
如果Redis中的數(shù)據(jù)完全丟棄也沒有關(guān)系(如Redis完全用作DB層數(shù)據(jù)的cache),那么無論是單機(jī),還是主從架構(gòu),都可以不進(jìn)行任何持久化。 在單機(jī)環(huán)境下(對于個人開發(fā)者,這種情況可能比較常見),如果可以接受十幾分鐘或更多的數(shù)據(jù)丟失,選擇RDB持久化對Redis的性能更加有利,如果只能接受秒級別的數(shù)據(jù)丟失,應(yīng)該選擇AOF。
但在多數(shù)情況下,我們都會配置主從環(huán)境,Slave的存在既可以實(shí)現(xiàn)數(shù)據(jù)的熱備,也可以進(jìn)行讀寫分離分擔(dān)Redis讀請求,以及在Master宕掉后繼續(xù)提供服務(wù)。在這種情況下,一種可行的做法是:
Master:完全關(guān)閉持久化,這樣可以讓Master的性能達(dá)到最好;
Slave:關(guān)閉RDB持久化,開啟AOF(如果對數(shù)據(jù)安全要求不高,開啟RDB持久化關(guān)閉AOF也可以),并定時對持久化文件進(jìn)行備份(如備份到其他文件夾,并標(biāo)記好備份的時間)。然后關(guān)閉AOF的自動重寫,然后添加定時任務(wù),在每天Redis閑時(如凌晨12點(diǎn))調(diào)用bgrewriteaof。
審核編輯:劉清
-
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3800瀏覽量
64402 -
MySQL
+關(guān)注
關(guān)注
1文章
811瀏覽量
26580 -
MYSQL數(shù)據(jù)庫
+關(guān)注
關(guān)注
0文章
96瀏覽量
9392 -
Redis
+關(guān)注
關(guān)注
0文章
376瀏覽量
10878
原文標(biāo)題:一文搞懂Redis持久化
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論