肖劍偉 廣東省科技職業技術學校
通過減少耗時的數據庫數據訪問,增加在緩存上分發數據達到高并發的數據請求需求。
整體架構圖:

方案介紹:
1.從整體架構圖可以看出,一個整體的架構需要多個架構層組成,而所有的架構組織都是為了系統的健壯性,可拓展性來設計。但是,這上面的架構也并不是適用所有的業務系統,這里只是方便理解,不做專門的分析,我們重點介紹緩存機制的改進。
2.對并發處理有過相關經驗的人都知道,使用緩存機制一般都會使用到ehCache(本地緩存),redis(分布式緩存)等工具來實現,本文將以Java語言來進行描述,而對于哪一種方案的實現都會根據自有的業務來進行選擇,其中ehCache本地緩存比較多的是用在實時性要求不高,處理速度要求卻比較高的情況;redis分布式緩存則在實時性要求相對來說會比較高,而處理速度會由于網絡帶寬或者其他因素導致速度相對來說會慢一點。因此,可以把兩種緩存機制加在一起,實現了二級緩存機制,也叫雙極緩存機制。這樣既提高了緩存速度,又提高了實時效應。
3.從上面架構圖來看,雙極緩存已經可以滿足中型企業的數據訪問需求了,一定程度上緩解了數據庫的壓力,在大部分企業上派得上用場,類似日活躍用戶100萬左右的企業應該是可以滿足需求的。但是在超大型互聯網企業中,日活躍用戶超過上億,例如BAT企業,他們這些企業在每秒鐘的訪問頻率都是很驚人的幾何級數增長。所以,當ehCache或者redis等數據超時的那一刻都會有龐大的數據穿透到數據庫,給數據庫造成極大的壓力,甚至宕機(服務器不能正常工作)。在相同成本的情況下(指的是硬件設施相同),雙極緩存仍然不能滿足超大型企業的需求。因此,我們采用了“雙極緩存+單點穿透”來實現緩存的無縫銜接,簡稱穿透式雙極緩存。
4.穿透式雙極緩存的原理是在數據訪問緩存的時候,根據緩存的過期數據,讓某一條線程去訪問上一層服務器,其他線程保持不變,等該條線程返回的數據更新本地數據。例如:有一條數據通過ehcache的時候判斷是否快到過期時間的某個數據,這時候會讓這條數據去訪問redis或者數據庫、redis或者數據庫返回的時候同時更新ehcache。邏輯圖如下:

代碼實現:
說明:判斷當前線程是否達到穿透的條件,如果滿足條件,則線程單獨訪問分布式緩存并更新本地緩存,其他線程不做穿透、等該條緩存更新本地緩存后,所有的線程都訪問同個數據。


說明:封裝EhCacheCacheManager類,實現本地緩存增刪改查操作,并超時失效等。


說明:封裝RedisTempLate類,實現分布式緩存增刪改查操作,并超時失效等。



說明:通過使用 maven引入第三部包

該方案在本地緩存即將過期之前用單獨一條線程重新拉取了最新數據,并更新了本地緩存的過期時間,既保證了數據的有效性,又確保了并發不會在同一時刻穿透上一層服務。因此,方案有效的解決了高并發,高實效的需求!