肖劍偉 廣東省科技職業(yè)技術(shù)學(xué)校
通過(guò)減少耗時(shí)的數(shù)據(jù)庫(kù)數(shù)據(jù)訪(fǎng)問(wèn),增加在緩存上分發(fā)數(shù)據(jù)達(dá)到高并發(fā)的數(shù)據(jù)請(qǐng)求需求。
整體架構(gòu)圖:
方案介紹:
1.從整體架構(gòu)圖可以看出,一個(gè)整體的架構(gòu)需要多個(gè)架構(gòu)層組成,而所有的架構(gòu)組織都是為了系統(tǒng)的健壯性,可拓展性來(lái)設(shè)計(jì)。但是,這上面的架構(gòu)也并不是適用所有的業(yè)務(wù)系統(tǒng),這里只是方便理解,不做專(zhuān)門(mén)的分析,我們重點(diǎn)介紹緩存機(jī)制的改進(jìn)。
2.對(duì)并發(fā)處理有過(guò)相關(guān)經(jīng)驗(yàn)的人都知道,使用緩存機(jī)制一般都會(huì)使用到ehCache(本地緩存),redis(分布式緩存)等工具來(lái)實(shí)現(xiàn),本文將以Java語(yǔ)言來(lái)進(jìn)行描述,而對(duì)于哪一種方案的實(shí)現(xiàn)都會(huì)根據(jù)自有的業(yè)務(wù)來(lái)進(jìn)行選擇,其中ehCache本地緩存比較多的是用在實(shí)時(shí)性要求不高,處理速度要求卻比較高的情況;redis分布式緩存則在實(shí)時(shí)性要求相對(duì)來(lái)說(shuō)會(huì)比較高,而處理速度會(huì)由于網(wǎng)絡(luò)帶寬或者其他因素導(dǎo)致速度相對(duì)來(lái)說(shuō)會(huì)慢一點(diǎn)。因此,可以把兩種緩存機(jī)制加在一起,實(shí)現(xiàn)了二級(jí)緩存機(jī)制,也叫雙極緩存機(jī)制。這樣既提高了緩存速度,又提高了實(shí)時(shí)效應(yīng)。
3.從上面架構(gòu)圖來(lái)看,雙極緩存已經(jīng)可以滿(mǎn)足中型企業(yè)的數(shù)據(jù)訪(fǎng)問(wèn)需求了,一定程度上緩解了數(shù)據(jù)庫(kù)的壓力,在大部分企業(yè)上派得上用場(chǎng),類(lèi)似日活躍用戶(hù)100萬(wàn)左右的企業(yè)應(yīng)該是可以滿(mǎn)足需求的。但是在超大型互聯(lián)網(wǎng)企業(yè)中,日活躍用戶(hù)超過(guò)上億,例如BAT企業(yè),他們這些企業(yè)在每秒鐘的訪(fǎng)問(wèn)頻率都是很驚人的幾何級(jí)數(shù)增長(zhǎng)。所以,當(dāng)ehCache或者redis等數(shù)據(jù)超時(shí)的那一刻都會(huì)有龐大的數(shù)據(jù)穿透到數(shù)據(jù)庫(kù),給數(shù)據(jù)庫(kù)造成極大的壓力,甚至宕機(jī)(服務(wù)器不能正常工作)。在相同成本的情況下(指的是硬件設(shè)施相同),雙極緩存仍然不能滿(mǎn)足超大型企業(yè)的需求。因此,我們采用了“雙極緩存+單點(diǎn)穿透”來(lái)實(shí)現(xiàn)緩存的無(wú)縫銜接,簡(jiǎn)稱(chēng)穿透式雙極緩存。
4.穿透式雙極緩存的原理是在數(shù)據(jù)訪(fǎng)問(wèn)緩存的時(shí)候,根據(jù)緩存的過(guò)期數(shù)據(jù),讓某一條線(xiàn)程去訪(fǎng)問(wèn)上一層服務(wù)器,其他線(xiàn)程保持不變,等該條線(xiàn)程返回的數(shù)據(jù)更新本地?cái)?shù)據(jù)。例如:有一條數(shù)據(jù)通過(guò)ehcache的時(shí)候判斷是否快到過(guò)期時(shí)間的某個(gè)數(shù)據(jù),這時(shí)候會(huì)讓這條數(shù)據(jù)去訪(fǎng)問(wèn)redis或者數(shù)據(jù)庫(kù)、redis或者數(shù)據(jù)庫(kù)返回的時(shí)候同時(shí)更新ehcache。邏輯圖如下:
代碼實(shí)現(xiàn):
說(shuō)明:判斷當(dāng)前線(xiàn)程是否達(dá)到穿透的條件,如果滿(mǎn)足條件,則線(xiàn)程單獨(dú)訪(fǎng)問(wèn)分布式緩存并更新本地緩存,其他線(xiàn)程不做穿透、等該條緩存更新本地緩存后,所有的線(xiàn)程都訪(fǎng)問(wèn)同個(gè)數(shù)據(jù)。
說(shuō)明:封裝EhCacheCacheManager類(lèi),實(shí)現(xiàn)本地緩存增刪改查操作,并超時(shí)失效等。
說(shuō)明:封裝RedisTempLate類(lèi),實(shí)現(xiàn)分布式緩存增刪改查操作,并超時(shí)失效等。
說(shuō)明:通過(guò)使用 maven引入第三部包
該方案在本地緩存即將過(guò)期之前用單獨(dú)一條線(xiàn)程重新拉取了最新數(shù)據(jù),并更新了本地緩存的過(guò)期時(shí)間,既保證了數(shù)據(jù)的有效性,又確保了并發(fā)不會(huì)在同一時(shí)刻穿透上一層服務(wù)。因此,方案有效的解決了高并發(fā),高實(shí)效的需求!