Redis學(xué)習(xí)筆記

聊聊redis持久化 – 兩種方式

redis提供了兩種持久化的方式涵但,分別是RDB(Redis DataBase)和AOF(Append Only File)。

RDB塑娇,簡(jiǎn)而言之劫侧,就是在不同的時(shí)間點(diǎn)烧栋,將redis存儲(chǔ)的數(shù)據(jù)生成快照并存儲(chǔ)到磁盤等介質(zhì)上;

AOF珍特,則是換了一個(gè)角度來實(shí)現(xiàn)持久化魔吐,那就是將redis執(zhí)行過的所有寫指令記錄下來酬姆,在下次redis重新啟動(dòng)時(shí),只要把這些寫指令從前到后再重復(fù)執(zhí)行一遍骨宠,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù)了。

其實(shí)RDB和AOF兩種方式也可以同時(shí)使用桦卒,在這種情況下闸盔,如果redis重啟的話琳省,則會(huì)優(yōu)先采用AOF方式來進(jìn)行數(shù)據(jù)恢復(fù),這是因?yàn)锳OF方式的數(shù)據(jù)恢復(fù)完整度更高击费。

如果你沒有數(shù)據(jù)持久化的需求蔫巩,也完全可以關(guān)閉RDB和AOF方式快压,這樣的話蔫劣,redis將變成一個(gè)純內(nèi)存數(shù)據(jù)庫,就像memcache一樣歪沃。


聊聊redis持久化 – RDB

RDB方式嫌松,是將redis某一時(shí)刻的數(shù)據(jù)持久化到磁盤中萎羔,是一種快照式的持久化方法。

redis在進(jìn)行數(shù)據(jù)持久化的過程中育灸,會(huì)先將數(shù)據(jù)寫入到一個(gè)臨時(shí)文件中磅崭,待持久化過程都結(jié)束了瓦哎,才會(huì)用這個(gè)臨時(shí)文件替換上次持久化好的文件柔逼。正是這種特性愉适,讓我們可以隨時(shí)來進(jìn)行備份癣漆,因?yàn)榭煺瘴募偸峭暾捎玫摹?/p>

對(duì)于RDB方式惠爽,redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來進(jìn)行持久化婚肆,而主進(jìn)程是不會(huì)進(jìn)行任何IO操作的,這樣就確保了redis極高的性能用僧。

如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù)赞咙,且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感攀操,那RDB方式要比AOF方式更加的高效。

雖然RDB有不少優(yōu)點(diǎn),但它的缺點(diǎn)也是不容忽視的健芭。如果你對(duì)數(shù)據(jù)的完整性非常敏感秀姐,那么RDB方式就不太適合你省有,因?yàn)榧词鼓忝?分鐘都持久化一次,當(dāng)redis故障時(shí)伸头,仍然會(huì)有近5分鐘的數(shù)據(jù)丟失恤磷。所以,redis還提供了另一種持久化方式魔策,那就是AOF河胎。


采用RDB持久方式游岳,Redis會(huì)定期保存數(shù)據(jù)快照至一個(gè)rbd文件中吭历,并在啟動(dòng)時(shí)自動(dòng)加載rdb文件,恢復(fù)之前保存的數(shù)據(jù)摩骨±嗜簦可以在配置文件中配置Redis進(jìn)行快照保存的時(shí)機(jī)

save [seconds] [changes]

意為在[seconds]秒內(nèi)如果發(fā)生了[changes]次數(shù)據(jù)修改哭懈,則進(jìn)行一次RDB快照保存遣总,例如

save 60 100

會(huì)讓Redis每60秒檢查一次數(shù)據(jù)變更情況,如果發(fā)生了100次或以上的數(shù)據(jù)變更容达,則進(jìn)行RDB快照保存花盐。

可以配置多條save指令菇爪,讓Redis執(zhí)行多級(jí)的快照保存策略凳宙。

Redis默認(rèn)開啟RDB快照,默認(rèn)的RDB策略如下:


聊聊redis持久化 – AOF

AOF诈嘿,英文是Append Only File奖亚,即只允許追加不允許改寫的文件。

如前面介紹的爆袍,AOF方式是將執(zhí)行過的寫指令記錄下來陨囊,在數(shù)據(jù)恢復(fù)時(shí)按照從前到后的順序再將指令都執(zhí)行一遍夹攒,就這么簡(jiǎn)單咏尝。

我們通過配置redis.conf中的appendonly yes就可以打開AOF功能。如果有寫操作(如SET等)胎食,redis就會(huì)被追加到AOF文件的末尾厕怜。

默認(rèn)的AOF持久化策略是每秒鐘fsync一次(fsync是指把緩存中的寫指令記錄到磁盤中)蕾总,因?yàn)樵谶@種情況下生百,redis仍然可以保持很好的處理性能,即使redis故障,也只會(huì)丟失最近1秒鐘的數(shù)據(jù)蜡坊。

如果在追加日志時(shí)秕衙,恰好遇到磁盤空間滿僵刮、inode滿或斷電等情況導(dǎo)致日志寫入不完整,也沒有關(guān)系曼追,redis提供了redis-check-aof工具汉规,可以用來進(jìn)行日志修復(fù)。

因?yàn)椴捎昧俗芳臃绞秸胧罚绻蛔鋈魏翁幚淼脑捑祝珹OF文件會(huì)變得越來越大,為此啄枕,redis提供了AOF文件重寫(rewrite)機(jī)制婚陪,即當(dāng)AOF文件的大小超過所設(shè)定的閾值時(shí),redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮频祝,只保留可以恢復(fù)數(shù)據(jù)的最小指令集泌参。舉個(gè)例子或許更形象,假如我們調(diào)用了100次INCR指令智润,在AOF文件中就要存儲(chǔ)100條指令及舍,但這明顯是很低效的窟绷,完全可以把這100條指令合并成一條SET指令锯玛,這就是重寫機(jī)制的原理。

在進(jìn)行AOF重寫時(shí)兼蜈,仍然是采用先寫臨時(shí)文件攘残,全部完成后再替換的流程,所以斷電为狸、磁盤滿等問題都不會(huì)影響AOF文件的可用性歼郭,這點(diǎn)大家可以放心。

AOF方式的另一個(gè)好處辐棒,我們通過一個(gè)“場(chǎng)景再現(xiàn)”來說明病曾。某同學(xué)在操作redis時(shí),不小心執(zhí)行了FLUSHALL漾根,導(dǎo)致redis內(nèi)存中的數(shù)據(jù)全部被清空了泰涂,這是很悲劇的事情。不過這也不是世界末日辐怕,只要redis配置了AOF持久化方式逼蒙,且AOF文件還沒有被重寫(rewrite),我們就可以用最快的速度暫停redis并編輯AOF文件寄疏,將最后一行的FLUSHALL命令刪除是牢,然后重啟redis僵井,就可以恢復(fù)redis的所有數(shù)據(jù)到FLUSHALL之前的狀態(tài)了。是不是很神奇驳棱,這就是AOF持久化方式的好處之一批什。但是如果AOF文件已經(jīng)被重寫了,那就無法通過這種方法來恢復(fù)數(shù)據(jù)了蹈胡。

雖然優(yōu)點(diǎn)多多渊季,但AOF方式也同樣存在缺陷,比如在同樣數(shù)據(jù)規(guī)模的情況下罚渐,AOF文件要比RDB文件的體積大却汉。而且,AOF方式的恢復(fù)速度也要慢于RDB方式荷并。

如果你直接執(zhí)行BGREWRITEAOF命令合砂,那么redis會(huì)生成一個(gè)全新的AOF文件,其中便包括了可以恢復(fù)現(xiàn)有數(shù)據(jù)的最少的命令集源织。

如果運(yùn)氣比較差翩伪,AOF文件出現(xiàn)了被寫壞的情況,也不必過分擔(dān)憂谈息,redis并不會(huì)貿(mào)然加載這個(gè)有問題的AOF文件缘屹,而是報(bào)錯(cuò)退出。這時(shí)可以通過以下步驟來修復(fù)出錯(cuò)的文件:

1.備份被寫壞的AOF文件

2.運(yùn)行redis-check-aof –fix進(jìn)行修復(fù)

3.用diff -u來看下兩個(gè)文件的差異侠仇,確認(rèn)問題點(diǎn)

4.重啟redis轻姿,加載修復(fù)后的AOF文件


聊聊redis持久化 – AOF重寫

AOF重寫的內(nèi)部運(yùn)行原理,我們有必要了解一下逻炊。

在重寫即將開始之際互亮,redis會(huì)創(chuàng)建(fork)一個(gè)“重寫子進(jìn)程”,這個(gè)子進(jìn)程會(huì)首先讀取現(xiàn)有的AOF文件余素,并將其包含的指令進(jìn)行分析壓縮并寫入到一個(gè)臨時(shí)文件中豹休。

與此同時(shí),主工作進(jìn)程會(huì)將新接收到的寫指令一邊累積到內(nèi)存緩沖區(qū)中桨吊,一邊繼續(xù)寫入到原有的AOF文件中威根,這樣做是保證原有的AOF文件的可用性,避免在重寫過程中出現(xiàn)意外视乐。

當(dāng)“重寫子進(jìn)程”完成重寫工作后医窿,它會(huì)給父進(jìn)程發(fā)一個(gè)信號(hào),父進(jìn)程收到信號(hào)后就會(huì)將內(nèi)存中緩存的寫指令追加到新AOF文件中炊林。

當(dāng)追加結(jié)束后,redis就會(huì)用新AOF文件來代替舊AOF文件卷要,之后再有新的寫指令渣聚,就都會(huì)追加到新的AOF文件中了独榴。


聊聊redis的事務(wù)處理

眾所周知,事務(wù)是指“一個(gè)完整的動(dòng)作奕枝,要么全部執(zhí)行棺榔,要么什么也沒有做”。

在聊redis事務(wù)處理之前隘道,要先和大家介紹四個(gè)redis指令症歇,即MULTI、EXEC谭梗、DISCARD忘晤、WATCH。這四個(gè)指令構(gòu)成了redis事務(wù)處理的基礎(chǔ)激捏。

1.MULTI用來組裝一個(gè)事務(wù)设塔;

2.EXEC用來執(zhí)行一個(gè)事務(wù);

3.DISCARD用來取消一個(gè)事務(wù)远舅;

4.WATCH用來監(jiān)視一些key闰蛔,一旦這些key在事務(wù)執(zhí)行之前被改變,則取消事務(wù)的執(zhí)行图柏。


????????我們?cè)谟肕ULTI組裝事務(wù)時(shí)序六,每一個(gè)命令都會(huì)進(jìn)入到內(nèi)存隊(duì)列中緩存起來,如果出現(xiàn)QUEUED則表示我們這個(gè)命令成功插入了緩存隊(duì)列蚤吹,在將來執(zhí)行EXEC時(shí)例诀,這些被QUEUED的命令都會(huì)被組裝成一個(gè)事務(wù)來執(zhí)行。對(duì)于事務(wù)的執(zhí)行來說距辆,如果redis開啟了AOF持久化的話余佃,那么一旦事務(wù)被成功執(zhí)行,事務(wù)中的命令就會(huì)通過write命令一次性寫到磁盤中去跨算,如果在向磁盤中寫的過程中恰好出現(xiàn)斷電爆土、硬件故障等問題,那么就可能出現(xiàn)只有部分命令進(jìn)行了AOF持久化诸蚕,這時(shí)AOF文件就會(huì)出現(xiàn)不完整的情況步势,這時(shí),我們可以使用redis-check-aof工具來修復(fù)這一問題背犯,這個(gè)工具會(huì)將AOF文件中不完整的信息移除坏瘩,確保AOF文件完整可用。


Bitmap和HyperLogLog

????????Bitmap在Redis中不是一種實(shí)際的數(shù)據(jù)類型漠魏,而是一種將String作為Bitmap使用的方法倔矾。可以理解為將String轉(zhuǎn)換為bit數(shù)組。使用Bitmap來存儲(chǔ)true/false類型的簡(jiǎn)單數(shù)據(jù)極為節(jié)省空間哪自。

????????HyperLogLogs是一種主要用于數(shù)量統(tǒng)計(jì)的數(shù)據(jù)結(jié)構(gòu)丰包,它和Set類似,維護(hù)一個(gè)不可重復(fù)的String集合壤巷,但是HyperLogLogs并不維護(hù)具體的member內(nèi)容邑彪,只維護(hù)member的個(gè)數(shù)。也就是說胧华,HyperLogLogs只能用于計(jì)算一個(gè)集合中不重復(fù)的元素?cái)?shù)量寄症,所以它比Set要節(jié)省很多內(nèi)存空間。


其他常用命令

EXISTS:判斷指定的key是否存在矩动,返回1代表存在有巧,0代表不存在,時(shí)間復(fù)雜度O(1)

DEL:刪除指定的key及其對(duì)應(yīng)的value铅忿,時(shí)間復(fù)雜度O(N)剪决,N為刪除的key數(shù)量

EXPIRE/PEXPIRE:為一個(gè)key設(shè)置有效期,單位為秒或毫秒檀训,時(shí)間復(fù)雜度O(1)

TTL/PTTL:返回一個(gè)key剩余的有效時(shí)間柑潦,單位為秒或毫秒,時(shí)間復(fù)雜度O(1)

RENAME/RENAMENX:將key重命名為newkey峻凫。使用RENAME時(shí)渗鬼,如果newkey已經(jīng)存在,其值會(huì)被覆蓋荧琼;使用RENAMENX時(shí)譬胎,如果newkey已經(jīng)存在,則不會(huì)進(jìn)行任何操作命锄,時(shí)間復(fù)雜度O(1)

TYPE:返回指定key的類型堰乔,string, list, set, zset, hash。時(shí)間復(fù)雜度O(1)

CONFIG GET:獲得Redis某配置項(xiàng)的當(dāng)前值脐恩,可以使用*通配符镐侯,時(shí)間復(fù)雜度O(1)

CONFIG SET:為Redis某個(gè)配置項(xiàng)設(shè)置新值,時(shí)間復(fù)雜度O(1)

CONFIG REWRITE:讓Redis重新加載redis.conf中的配置


內(nèi)存管理與數(shù)據(jù)淘汰機(jī)制

通過如下配置控制Redis使用的最大內(nèi)存:maxmemory 100mb

在內(nèi)存占用達(dá)到了maxmemory后驶冒,再向Redis寫入數(shù)據(jù)時(shí)苟翻,Redis會(huì):

1.根據(jù)配置的數(shù)據(jù)淘汰策略嘗試淘汰數(shù)據(jù),釋放空間

2.如果沒有數(shù)據(jù)可以淘汰骗污,或者沒有配置數(shù)據(jù)淘汰策略崇猫,那么Redis會(huì)對(duì)所有寫請(qǐng)求返回錯(cuò)誤,但讀請(qǐng)求仍然可以正常執(zhí)行

在為Redis設(shè)置maxmemory時(shí)需忿,需要注意:

????????如果采用了Redis的主從同步诅炉,主節(jié)點(diǎn)向從節(jié)點(diǎn)同步數(shù)據(jù)時(shí)蜡歹,會(huì)占用掉一部分內(nèi)存空間,如果maxmemory過于接近主機(jī)的可用內(nèi)存涕烧,導(dǎo)致數(shù)據(jù)同步時(shí)內(nèi)存不足季稳。所以設(shè)置的maxmemory不要過于接近主機(jī)可用的內(nèi)存,留出一部分預(yù)留用作主從同步澈魄。


數(shù)據(jù)淘汰機(jī)制

Redis提供了5種數(shù)據(jù)淘汰策略:

volatile-lru:使用LRU算法進(jìn)行數(shù)據(jù)淘汰(淘汰上次使用時(shí)間最早的,且使用次數(shù)最少的key)仲翎,只淘汰設(shè)定了有效期的key

allkeys-lru:使用LRU算法進(jìn)行數(shù)據(jù)淘汰痹扇,所有的key都可以被淘汰

volatile-random:隨機(jī)淘汰數(shù)據(jù),只淘汰設(shè)定了有效期的key

allkeys-random:隨機(jī)淘汰數(shù)據(jù)溯香,所有的key都可以被淘汰

volatile-ttl:淘汰剩余有效期最短的key

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲫构,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玫坛,更是在濱河造成了極大的恐慌结笨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湿镀,死亡現(xiàn)場(chǎng)離奇詭異炕吸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勉痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門赫模,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒸矛,你說我怎么就攤上這事赴蝇”刹牛” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疫蔓。 經(jīng)常有香客問我,道長(zhǎng)荞估,這世上最難降的妖魔是什么剩膘? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮蚊伞,結(jié)果婚禮上席赂,老公的妹妹穿的比我還像新娘。我一直安慰自己时迫,他們只是感情好颅停,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掠拳,像睡著了一般癞揉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天喊熟,我揣著相機(jī)與錄音柏肪,去河邊找鬼。 笑死芥牌,一個(gè)胖子當(dāng)著我的面吹牛烦味,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壁拉,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼谬俄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了弃理?” 一聲冷哼從身側(cè)響起溃论,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痘昌,沒想到半個(gè)月后钥勋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辆苔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年算灸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姑子。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乎婿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出街佑,到底是詐尸還是另有隱情谢翎,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布沐旨,位于F島的核電站森逮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏磁携。R本人自食惡果不足惜褒侧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谊迄。 院中可真熱鬧闷供,春花似錦、人聲如沸统诺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粮呢。三九已至婿失,卻和暖如春钞艇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豪硅。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工哩照, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懒浮。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓飘弧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砚著。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眯牧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 本文將從Redis的基本特性入手,通過講述Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對(duì)Redis的基本能力進(jìn)行直觀介紹剪个。之后概...
    kelgon閱讀 61,176評(píng)論 23 625
  • REmote DIctionary Server(Redis) 是一個(gè)由Salvatore Sanfilippo寫...
    yoyo鹿鳴閱讀 286評(píng)論 0 1
  • 1.1 資料 秧骑,最好的入門小冊(cè)子,可以先于一切文檔之前看扣囊,免費(fèi)乎折。 作者Antirez的博客,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,071評(píng)論 1 51
  • Redis雜談 Redis是近年來發(fā)展迅速的內(nèi)存數(shù)據(jù)庫侵歇,網(wǎng)上也已經(jīng)有多Redis的文章骂澄。但不管是英文還是中文,多數(shù)...
    迷失于重逢閱讀 1,566評(píng)論 0 14
  • 曾經(jīng)聽過一個(gè)觀點(diǎn)惕虑,并深以為然坟冲,作品是由作者創(chuàng)作的,但是對(duì)于這個(gè)作品的生命力溃蔫,已經(jīng)和原作者無關(guān)了健提,是這個(gè)作品在社會(huì)中...
    水平生閱讀 625評(píng)論 0 0