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