redis鎖如何解決并發(fā) redis如何解決hot key與big key問題?
redis如何解決hot key與big key問題?解決方案對(duì)bigkey接受word文檔合并對(duì)littlekey存儲(chǔ)位置的數(shù)據(jù)(onevalue)通過拆分,都變成value1,value2…val
redis如何解決hot key與big key問題?
解決方案
對(duì)bigkey接受word文檔合并
對(duì)littlekey存儲(chǔ)位置的數(shù)據(jù)(onevalue)通過拆分,都變成value1,value2…valueN,
假如littlevalue是個(gè)大json按照mset的,將這個(gè)key的內(nèi)容絞成到各個(gè)實(shí)例中,減小bigkey對(duì)數(shù)據(jù)量向外傾斜負(fù)面影響。
//存
msetkey1,vlaue1,key2,,valueN
//取
mgetclientkey1,
假如littlevalue是個(gè)大list,也可以拆成將list拆成。list_1,list_2,list3,listN
其他數(shù)據(jù)類型同理。
既已onekey又是chillkey
在開發(fā)過程中,有些key不只是因?yàn)樵L問量大,數(shù)據(jù)量也太大,這會(huì)兒也要決定這個(gè)key在用的場景,讀取在redis集群中是否需要是合理不的,是否需要可以使用其他組件來存儲(chǔ)更合適;如果沒有堅(jiān)持要用redis來存儲(chǔ),很有可能確定遷入出集群,常規(guī)一主一備(或1主多備)的架構(gòu)來存儲(chǔ)。
其他
怎么突然發(fā)現(xiàn)sodakey,queenkey
1.萬無一失-預(yù)判
在業(yè)務(wù)開發(fā)階段,還要對(duì)肯定轉(zhuǎn)成hotkey,queenkey的數(shù)據(jù)通過判斷,提前如何處理,這是需要的是對(duì)產(chǎn)品業(yè)務(wù)的理解,對(duì)運(yùn)營節(jié)奏的把握,對(duì)數(shù)據(jù)設(shè)計(jì)的經(jīng)驗(yàn)。
2.事中-監(jiān)控和自動(dòng)出現(xiàn)處理
監(jiān)控
在應(yīng)用程序端,對(duì)你每次只是請(qǐng)求redis的操作接受積攢上報(bào)到不推薦推薦,只不過在運(yùn)維資源不完全的場景下可以不決定。開發(fā)這個(gè)可以越過運(yùn)維管理一切都搞定);
在proxy層,對(duì)每一個(gè)redis請(qǐng)求參與收集到上報(bào)到(推薦推薦,運(yùn)維來做也是最好的方案);
對(duì)redis實(shí)例建議使用monitor命令統(tǒng)計(jì)熱點(diǎn)key(不我推薦,高并發(fā)條件下會(huì)有會(huì)造成redis內(nèi)存爆掉的隱患);
機(jī)器層面,Redis客戶端在用TCP協(xié)議與服務(wù)端進(jìn)行交互,通信協(xié)議采用的是RESP。如果不是站在機(jī)器的角度,可以不通過對(duì)機(jī)器上所有Redis端口的TCP數(shù)據(jù)包參與破霸體完成熱點(diǎn)key的統(tǒng)計(jì)(不推薦,公司每臺(tái)機(jī)器上的基本上組件早很多了,別再找事兒了);
自動(dòng)啟動(dòng)全面處理
通過監(jiān)控之后,程序是可以查看littlekey和hotkey,再不報(bào)警的同時(shí),程序?qū)igkey和hotkey進(jìn)行自動(dòng)啟動(dòng)處理。也可以通知程序猿依靠一定的工具通過定制化處理(在程序中對(duì)某種特定的key執(zhí)行前面提到的解決方案)
什么時(shí)候需要分布式鎖?
分布式鎖又是鎖在單體應(yīng)用形式的時(shí)候,要是多個(gè)線程要ftp訪問共享資源的時(shí)候,我們大多線程間加鎖的機(jī)制,在某一個(gè)時(shí)刻,只有一一個(gè)線程可以不對(duì)這個(gè)資源參與能操作,其他線程需要再等待鎖的釋放,Java中也有一些如何處理鎖的機(jī)制,例如synchronized。
而到了分布式的環(huán)境中,當(dāng)某個(gè)資源可以被多個(gè)系統(tǒng)訪問網(wǎng)絡(luò)不使用到的時(shí)候,目的是只要大家不能訪問這個(gè)數(shù)據(jù)是一致性的,那就就沒有要求再捆定時(shí)刻,只有被一個(gè)系統(tǒng)不使用,這時(shí)候線程之間的鎖機(jī)制就難以作用有限作用了,是因?yàn)榉植际江h(huán)境中,系統(tǒng)是會(huì)作戰(zhàn)部署到不同的機(jī)器上面的,那就就必須【分布式鎖】了。
什么時(shí)候需要不使用分布式鎖系統(tǒng)的總結(jié)來看,當(dāng)有多個(gè)客戶端必須訪問并操作同一個(gè)資源,還不需要保持這個(gè)資源一致性的時(shí)候,就是需要使用【分布式鎖】,讓多客戶端互斥的對(duì)共享資源進(jìn)行訪問。
舉個(gè)例子來只能證明幫一下忙:
有多個(gè)批處理任務(wù),兩臺(tái)機(jī)器而一次性處理,如果不是不加任何操縱的話,最大的可能同一個(gè)批處理被兩臺(tái)機(jī)器共有去處理一遍;如果沒有使用分布式鎖,在如何領(lǐng)取任務(wù)的時(shí)候,一個(gè)任務(wù)只會(huì)被一臺(tái)機(jī)器領(lǐng)取,那樣的話就肯定不會(huì)倒致任務(wù)的再重復(fù)一遍執(zhí)行;
再勤思考一些,要是A/B兩臺(tái)機(jī)器,任務(wù)1被A機(jī)器領(lǐng)取到并且處理,在去處理到一半的時(shí)候,A機(jī)器全死了,這樣這個(gè)批處理任務(wù)也就不能無驚無險(xiǎn)負(fù)責(zé)執(zhí)行了,即使A機(jī)器可以重新恢復(fù)。
這時(shí)候就可以不明白了分布式鎖是需要做哪些工作了排他性:在同一時(shí)間只會(huì)有一個(gè)客戶端能某些到鎖,其它客戶端無法同樣資源;盡量避免死鎖:鎖在一段時(shí)間內(nèi)管用,遠(yuǎn)遠(yuǎn)超過這個(gè)時(shí)間后會(huì)被釋放(都正常釋放者或無比能量);高可用:獲取或施放鎖的機(jī)制必須高可用且性能佳。我將減弱多多分享Java開發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的見解,只希望能得到你的關(guān)注。