大家好,如果您還對(duì)redis默認(rèn)的持久化機(jī)制不太了解,沒有關(guān)系,今天就由本站為大家分享redis默認(rèn)的持久化機(jī)制的知識(shí),包括redis關(guān)閉aof持久化的問(wèn)題都會(huì)給大家分析到,還望可以解決大家的問(wèn)題,下面我們就開始吧!
redis是如何實(shí)現(xiàn)主從同步機(jī)制的
Redis是一個(gè)開源的使用ANSIC語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。
Redis支持主從同步。數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,同步使用的是發(fā)布/訂閱機(jī)制。
按照同步的內(nèi)容可以分為全量同步和部分同步;
按照同步的時(shí)機(jī)可以分為初始化同步和實(shí)時(shí)數(shù)據(jù)同步;
初始化同步:
初始化同步一般是加掛子節(jié)點(diǎn),做全量同步。
1、slave啟動(dòng)的時(shí)候會(huì)向master發(fā)送同步指令SYNC,master接收到并調(diào)用SYNC的syncCommand函數(shù)做同步處理。
2、syncCommand函數(shù)會(huì)啟動(dòng)rdbSaveBackground備份進(jìn)程(如有該進(jìn)程存在不需創(chuàng)建啟動(dòng))做備份操作,備份進(jìn)程啟動(dòng)rdbSave函數(shù)保存?zhèn)浞菸募db。
3、master節(jié)點(diǎn)監(jiān)控備份程序執(zhí)行完畢后,會(huì)向slave發(fā)送rdb文件。
實(shí)時(shí)數(shù)據(jù)同步:
在一般redis主從模式中,主節(jié)點(diǎn)作為寫節(jié)點(diǎn),從節(jié)點(diǎn)為讀節(jié)點(diǎn)。主節(jié)點(diǎn)在接受到用戶寫操作后會(huì)通過(guò),通過(guò)內(nèi)部函數(shù)向slave節(jié)點(diǎn)通知進(jìn)行數(shù)據(jù)變更,該數(shù)據(jù)同步為部分?jǐn)?shù)據(jù)同步。
需要說(shuō)明的是主從復(fù)制不會(huì)阻塞master,在同步數(shù)據(jù)時(shí),master可以繼續(xù)處理client請(qǐng)求。同時(shí)在主從模式下只有一個(gè)主節(jié)點(diǎn),可以有多個(gè)slave節(jié)點(diǎn)。健康檢查發(fā)現(xiàn)主節(jié)點(diǎn)不可用的時(shí)候會(huì)選擇從slave節(jié)點(diǎn)中選擇一個(gè)升級(jí)為master,一般情況下,這種主從通過(guò)哨兵模式實(shí)現(xiàn)。
aof和rdb哪個(gè)是默認(rèn)開啟的
在Redis中,RDB是默認(rèn)開啟的持久化方式,它會(huì)定期將內(nèi)存中的數(shù)據(jù)快照保存到磁盤上。而AOF持久化則需要手動(dòng)配置開啟,它會(huì)記錄每一次寫操作,并保存到一個(gè)文件中。開啟AOF可以提高數(shù)據(jù)可靠性,但也會(huì)增加系統(tǒng)開銷。
redis持久化方式區(qū)別
Redis運(yùn)行時(shí)數(shù)據(jù)保存在內(nèi)存中,那么重啟了服務(wù)器數(shù)據(jù)丟失了怎么辦,自然也提供持久化的設(shè)置。
redis支持兩種持久化方式,RDB和aof模式。
RDB方式是定時(shí)將內(nèi)存中的數(shù)據(jù)dump到磁盤中。實(shí)現(xiàn)是定時(shí)fork個(gè)子進(jìn)程,將內(nèi)存數(shù)據(jù)寫入文件中,再替換上次生成的文件,這個(gè)過(guò)程如果服務(wù)器出現(xiàn)異常宕機(jī),那么會(huì)導(dǎo)致數(shù)據(jù)丟失。RDB模式一個(gè)文件保存redis所有數(shù)據(jù),在做數(shù)據(jù)恢復(fù)時(shí)就很方便。對(duì)某個(gè)時(shí)間節(jié)點(diǎn)做數(shù)據(jù)備份的場(chǎng)景也十分方便。
AOF則是記錄事務(wù)操作日志,追加寫入到文件中。aof支持三種策略記錄操作日志。
1.每修改同步,即每次事務(wù)操作都立即記錄。
2.每秒同步,每秒鐘異步記錄。
3.不同步,即不記錄。
每秒同步跟RDB一樣存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。對(duì)于大數(shù)據(jù)量的數(shù)據(jù)恢復(fù)上RDB會(huì)比AOF效率高。
Java互聯(lián)網(wǎng)架構(gòu)-基于分布式Redis如何發(fā)布數(shù)據(jù)與訂閱機(jī)制
事實(shí)上,redis生來(lái)就不是干消息發(fā)布與訂閱這件事的,一開始只是用做內(nèi)存緩存,后來(lái)才被開發(fā)出全局唯一ID,分布式鎖,消息隊(duì)列這些功能!
在我們一開始沒用成熟的消息中間件(mq,ons,kafka)的時(shí)候,就用了redis作為消息的發(fā)布訂閱機(jī)制!
redis作為一個(gè)內(nèi)存數(shù)據(jù)庫(kù),所有的數(shù)據(jù)都在內(nèi)存中進(jìn)行操作,只提供通過(guò)異步的方式(AOF或者RDB)進(jìn)行數(shù)據(jù)的持久化,在重啟的時(shí)候,從文件中把數(shù)據(jù)加載到內(nèi)存,所以redis速度非常快!
redis發(fā)布訂閱的原理又是啥?
redis通常分為client端(一般為多個(gè))和server端,一個(gè)客戶端(發(fā)布者)通過(guò)發(fā)送消息到channel中,redisserver中會(huì)維護(hù)一份pubsub_channels字典,以channel為key,所有的channel訂閱者組成的鏈表為value,在消息發(fā)布的時(shí)候,server會(huì)使用channel取出所有的訂閱者進(jìn)行遍歷,然后把消息發(fā)布給所有訂閱者!(為什么使用鏈表結(jié)構(gòu)?在訂閱者頻繁變動(dòng)的時(shí)候,鏈表的修改時(shí)間復(fù)雜度為O(1))!
redis作為消息發(fā)布訂閱具體有什么操作呢?
1,發(fā)布者:消息的發(fā)布者通過(guò)redis的指令publish生產(chǎn)消息,這個(gè)指令會(huì)返回相應(yīng)的值,表明消息訂閱者數(shù)量!
2,訂閱:消息的消費(fèi)者通過(guò)subscribe指令訂閱頻道(可多個(gè)),這個(gè)指令會(huì)返回訂閱的頻道,數(shù)量,和消費(fèi)的消息!
3,模糊匹配:類似于sql中的*,redis使用psubscribe指令訂閱模糊的符合某個(gè)條件的所有頻道!
4,取消訂閱:訂閱者通過(guò)unsubscribe命令取消某個(gè)頻道的訂閱,也會(huì)有相應(yīng)的返回值!
不過(guò)!!!
redis畢竟不是專門干這個(gè)的,不提供消息持久化,不提供消息事務(wù)機(jī)制,如果消息丟了,就等著干瞪眼了,所以成熟的消息中間件是一個(gè)很好的選擇!
上面這些指令很簡(jiǎn)單,只要下載個(gè)redis鏡像,玩一玩就會(huì)了,更多的技術(shù)分享,敬請(qǐng)關(guān)注。。。
redis持久化是否會(huì)影響效率
會(huì)影響效率還得存儲(chǔ)磁盤
面試中經(jīng)常被問(wèn)到的Redis持久化與恢復(fù)該如何解決
首先搞清楚:除非你修改源碼,否則redis從算法上沒有完備的持久化和恢復(fù)方案,所有的方案都建立在“發(fā)生意外時(shí)盡量減少數(shù)據(jù)丟失”的前提下,所以真正至關(guān)重要的數(shù)據(jù),至少不能只用redis保存。
其它就很簡(jiǎn)單了,配置文件可以打開持久化,設(shè)置好數(shù)據(jù)文件和存儲(chǔ)策略,大部分事redis會(huì)自己做好,注意selinux或apparmor策略不要跟redis沖突。需要還原時(shí)可以用redis-port
END,本文到此結(jié)束,如果可以幫助到大家,還望關(guān)注本站哦!