對于高并發(fā)的系統(tǒng),所有的請求都打在數(shù)據(jù)庫上是不明智的選擇。一般的做法是通過緩存來緩解數(shù)據(jù)庫的壓力。緩存是用于解決高并發(fā)場景下系統(tǒng)的性能及穩(wěn)定性問題的銀彈。最主要的就是要考慮到緩存的穿透性和數(shù)據(jù)一致性問題。 先來看一個示例: 初級程序員代碼 這是一個簡單應(yīng)用緩存的示例,存在以下幾個問題: 1:高并發(fā)的情況下,大部分請求會直接訪問數(shù)據(jù)庫。多線程的情況下,緩存還沒及時寫入,就會有大部分請求直接訪問數(shù)據(jù)庫。 2:業(yè)務(wù)邏輯與緩存之間解耦性太高。 先來解決第一個問題。就是利用鎖的機制。但是要考慮加鎖的地方,加的不對會導(dǎo)致性能問題,比如不能加到整個方法上。 中級程序員代碼 接下來解決第二個問題,這就是解耦問題,讓別的人也可以輕松使用這個緩存方法。那就是使用模板設(shè)計模式,做一個緩存模板。 高級程序員代碼 調(diào)用方式: 高級程序員代碼 目前為止,是一個相對比較完美的方案了。 但是作為架構(gòu)師,眼界還需要再開闊一下,那就是需要實現(xiàn)一個更加方便的架構(gòu)供更多的人靈活調(diào)用。給大家提示一下,借鑒Spring cache的思想使用AOP + Annotation等技術(shù)實現(xiàn)緩存與業(yè)務(wù)邏輯的解耦。 大概的流程如下: 1 . 獲取到攔截方法的 @Cache 注解,并生成緩存 key; 2 . 通過緩存 key,去緩存中獲取數(shù)據(jù); 3 . 如果緩存命中,執(zhí)行如下流程:
4 . 如果緩存沒有命中,執(zhí)行如下流程:
架構(gòu)師級別的設(shè)計 |
|
來自: 昵稱11935121 > 《未命名》