掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
有人可能看到“本地緩存”這四個字就會覺得不屑,“哼,現(xiàn)在誰還用本地緩存?直接用分布式緩存不就完了嘛”。

友誼網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),友誼網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為友誼成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的友誼做網(wǎng)站的公司定做!
然而,這就像你有一輛超級豪華的房車一樣,雖然它空間很大,設(shè)備很全,但你去市中心的時候,依然會開小轎車一樣,為啥?好停車?。∷?,不同的緩存類型是有不同得使用場景的。
并且,為了防止緩存雪崩問題、緩存擊穿問題,我們通常會采用多級緩存的解決方案,所謂的多級緩存就是:分布式緩存(Redis 或 Memcached)+本地緩存(Guava Cache 或 Caffeine)。因?yàn)榉植际骄彺婵赡軙?、可能會掛掉,所以為了系統(tǒng)的穩(wěn)定性,多級緩存策略使用的非常廣泛。
那么,問題來了,怎么保證本地緩存的一致性?
“
所謂的一致性是指在同時使用緩存和數(shù)據(jù)庫的場景下,要確保數(shù)據(jù)在緩存與數(shù)據(jù)庫中的更新操作保持同步。也就是當(dāng)對數(shù)據(jù)進(jìn)行修改時,無論是先修改緩存還是先修改數(shù)據(jù)庫,最終都要保證兩者的數(shù)據(jù)是一樣的,不會出現(xiàn)數(shù)據(jù)不一樣的問題。
在分布式系統(tǒng)中,使用本地緩存最大的問題就是一致性問題,所謂的一致性問題指的是當(dāng)數(shù)據(jù)庫發(fā)生數(shù)據(jù)變更時,緩存也要跟著一起變更。而分布式系統(tǒng)中每臺機(jī)器都有自己的本地緩存,所以想要保證(本地緩存的)一致性是一個比較難的問題,但通過以下手段可以最大程度的保證本地緩存的一致性問題。
設(shè)置本地緩存短時間內(nèi)失效,短的存活周期,保證了數(shù)據(jù)的時效性比較高,當(dāng)數(shù)據(jù)失效之后,再次訪問數(shù)據(jù)就會拉取新的數(shù)據(jù)了,這樣能盡可能的保證數(shù)據(jù)的一致性。
它的特點(diǎn)是:代碼實(shí)現(xiàn)簡單,不需要寫多余的代碼;缺點(diǎn)是,效果不是很明顯,不適合高并發(fā)的系統(tǒng)。
通過微服務(wù)中的配置中心(例如 Nacos)來協(xié)調(diào),因?yàn)樗蟹?wù)器都會連接到配置中心,所以當(dāng)數(shù)據(jù)修改之后,可以修改配置中心的配置,然后配置中心再把配置變更的事件推送給各個服務(wù),各個服務(wù)感知到配置中心的配置發(fā)生更改之后,再更新自己的本地緩存,這樣就實(shí)現(xiàn)了本地緩存的數(shù)據(jù)一致性。
使用本地緩存框架的自動更新功能,例如 Caffeine 中的 refresh 功能來自動刷新緩存,這樣就可以設(shè)置很短的時間來更新最新的數(shù)據(jù),從而也能盡可能的保證數(shù)據(jù)的一致性,如下代碼所示:
// 創(chuàng)建 Caffeine 緩存實(shí)例
Cache caffeineCache = Caffeine.newBuilder()
// 設(shè)置緩存項(xiàng)在 5s 后開始自動更新
.refreshAfterWrite(5, TimeUnit.SECONDS)
// 自定義緩存更新邏輯(即獲取新值邏輯)
.build(new CacheLoader() {
@Override
public void reload(String key, String oldValue) throws Exception {
// 模擬更新緩存的操作
updateCache(key, oldValue);
}
}); 不同的業(yè)務(wù)系統(tǒng),會采用不同的解決方案,例如以下這些場景和對應(yīng)的解決方案:
在多級緩存中,本地緩存是不可或缺的組成部分,而想要保證本地緩存的數(shù)據(jù)一致性,可能采用:設(shè)置較短的本地緩存過期時間、通過配置中心來協(xié)調(diào)和同步本地緩存,以及使用本地緩存框架的自動更新功能保證數(shù)據(jù)的一致性等解決方案,而不同的業(yè)務(wù)場景,選擇的解決方案也是不同的。
通過以上機(jī)制,我們就能實(shí)現(xiàn)本地緩存的一致性了。那么問題來了,如何實(shí)現(xiàn)分布式緩存的數(shù)據(jù)一致性呢?

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流