Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)。它跟memcached類(lèi)似,不過(guò)數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類(lèi)型很豐富。有字符串,鏈表,集 合和有序集合。支持在服務(wù)器端計(jì)算集合的并,交和補(bǔ)集(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器。
Redis的所有數(shù)據(jù)都是保存在內(nèi)存中,然后不定期的通過(guò)異步方式保存到磁盤(pán)上(這稱(chēng)為“半持久化模式”);也可以把每一次數(shù)據(jù)變化都寫(xiě)入到一個(gè)append only file(aof)里面(這稱(chēng)為“全持久化模式”)。
第一種方法 filesnapshotting :默認(rèn)redis是會(huì)以快照的形式將數(shù)據(jù)持久化到磁盤(pán)的(一個(gè)二進(jìn)制文件,dump.rdb,這個(gè)文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之內(nèi),redis至少發(fā)生M次修改則redis抓快照到磁盤(pán)。當(dāng)然我們也可以手動(dòng)執(zhí)行save或者bgsave(異步)做快照。
工作原理簡(jiǎn)單介紹一下:當(dāng)redis需要做持久化時(shí),redis會(huì)fork一個(gè)子進(jìn)程;子進(jìn)程將數(shù)據(jù)寫(xiě)到磁盤(pán)上一個(gè)臨時(shí)RDB文件中;當(dāng)子進(jìn)程完成寫(xiě)臨時(shí)文件后,將原來(lái)的RDB替換掉,這樣的好處就是可以 copy-on-write
還有一種持久化方法是 Append-only :filesnapshotting方法在redis異常死掉時(shí),最近的數(shù)據(jù)會(huì)丟失(丟失數(shù)據(jù)的多少視你save策略的配置),所以這是它最大的缺點(diǎn),當(dāng)業(yè)務(wù)量很大時(shí),丟失的數(shù)據(jù)是很多的。Append-only方法可以做到全部數(shù)據(jù)不丟失,但redis的性能就要差些。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í)刻。
LOG Rewriting隨著修改數(shù)據(jù)的執(zhí)行AOF文件會(huì)越來(lái)越大,其中很多內(nèi)容記錄某一個(gè)key的變化情況。因此redis有了一種比較有意思的特性:在后臺(tái)重建AOF文件,而不會(huì)影響client端操作。在任何時(shí)候執(zhí)行 BGREWRITEAOF 命令,都會(huì)把當(dāng)前內(nèi)存中最短序列的命令寫(xiě)到磁盤(pán),這些命令可以完全構(gòu)建當(dāng)前的數(shù)據(jù)情況,而不會(huì)存在多余的變化情況(比如狀態(tài)變化,計(jì)數(shù)器變化等),縮小的AOF文件的大小。 所以當(dāng)使用AOF時(shí),redis推薦同時(shí)使用BGREWRITEAOF 。
AOF文件刷新的方式,有三種,參考配置參數(shù) appendfsync ?: appendfsync always 每提交一個(gè)修改命令都調(diào)用fsync刷新到AOF文件,非常非常慢,但也非常安全; appendfsync everysec 每秒鐘都調(diào)用fsync刷新到AOF文件,很快,但可能會(huì)丟失一秒以?xún)?nèi)的數(shù)據(jù); appendfsync no 依靠OS進(jìn)行刷新,redis不主動(dòng)刷新AOF,這樣最快,但安全性就差。默認(rèn)并推薦每秒刷新,這樣在速度和安全上都做到了兼顧。
可能由于系統(tǒng)原因?qū)е铝薃OF損壞,redis無(wú)法再加載這個(gè)AOF,可以按照下面步驟來(lái)修復(fù):首先做一個(gè)AOF文件的備份,復(fù)制到其他地方;修復(fù)原始AOF文件,執(zhí)行: $ redis-check-aof –fix ;可以通過(guò)diff –u命令來(lái)查看修復(fù)前后文件不一致的地方;重啟redis服務(wù)。
LOG Rewrite的工作原理:同樣用到了copy-on-write:首先redis會(huì)fork一個(gè)子進(jìn)程;子進(jìn)程將最新的AOF寫(xiě)入一個(gè)臨時(shí)文件;父進(jìn)程增量的把內(nèi)存中的最新執(zhí)行的修改寫(xiě)入(這時(shí)仍寫(xiě)入舊的AOF,rewrite如果失敗也是安全的);當(dāng)子進(jìn)程完成rewrite臨時(shí)文件后,父進(jìn)程會(huì)收到一個(gè)信號(hào),并把之前內(nèi)存中增量的修改寫(xiě)入臨時(shí)文件末尾;這時(shí)redis將舊AOF文件重命名,臨時(shí)文件重命名,開(kāi)始向新的AOF中寫(xiě)入。
最后,為以防萬(wàn)一(機(jī)器壞掉或磁盤(pán)壞掉),記得定期把使用 filesnapshotting 或 Append-only 生成的*rdb *.aof文件備份到遠(yuǎn)程機(jī)器上。我是用crontab每半小時(shí)SCP一次。我沒(méi)有使用redis的主從功能 ,因?yàn)榘胄r(shí)備份一次應(yīng)該是可以了,而且我覺(jué)得有如果做主從有點(diǎn)浪費(fèi)機(jī)器。這個(gè)最終還是看應(yīng)用來(lái)定了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
