最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何保證Java本地緩存的一致性

 更新時(shí)間:2024年01月17日 11:53:37   作者:Java中文社群  
所謂的一致性是指在同時(shí)使用緩存和數(shù)據(jù)庫(kù)的場(chǎng)景下,要確保數(shù)據(jù)在緩存與數(shù)據(jù)庫(kù)中的更新操作保持同步,那么,怎么保證Java本地緩存的一致性?所以本文將給大家介紹了如何保證Java本地緩存的一致性,需要的朋友可以參考下

有人可能看到“本地緩存”這四個(gè)字就會(huì)覺(jué)得不屑,“哼,現(xiàn)在誰(shuí)還用本地緩存?直接用分布式緩存不就完了嘛”。

然而,這就像你有一輛超級(jí)豪華的房車一樣,雖然它空間很大,設(shè)備很全,但你去市中心的時(shí)候,依然會(huì)開(kāi)小轎車一樣,為啥?好停車??!所以,不同的緩存類型是有不同得使用場(chǎng)景的。

并且,為了防止緩存雪崩問(wèn)題、緩存擊穿問(wèn)題,我們通常會(huì)采用多級(jí)緩存的解決方案,所謂的多級(jí)緩存就是:分布式緩存(Redis 或 Memcached)+本地緩存(Guava Cache 或 Caffeine)。因?yàn)榉植际骄彺婵赡軙?huì)失效、可能會(huì)掛掉,所以為了系統(tǒng)的穩(wěn)定性,多級(jí)緩存策略使用的非常廣泛。

那么,問(wèn)題來(lái)了,怎么保證本地緩存的一致性?

所謂的一致性是指在同時(shí)使用緩存和數(shù)據(jù)庫(kù)的場(chǎng)景下,要確保數(shù)據(jù)在緩存與數(shù)據(jù)庫(kù)中的更新操作保持同步。也就是當(dāng)對(duì)數(shù)據(jù)進(jìn)行修改時(shí),無(wú)論是先修改緩存還是先修改數(shù)據(jù)庫(kù),最終都要保證兩者的數(shù)據(jù)是一樣的,不會(huì)出現(xiàn)數(shù)據(jù)不一樣的問(wèn)題。

1.如何保證本地緩存的一致性?

在分布式系統(tǒng)中,使用本地緩存最大的問(wèn)題就是一致性問(wèn)題,所謂的一致性問(wèn)題指的是當(dāng)數(shù)據(jù)庫(kù)發(fā)生數(shù)據(jù)變更時(shí),緩存也要跟著一起變更。而分布式系統(tǒng)中每臺(tái)機(jī)器都有自己的本地緩存,所以想要保證(本地緩存的)一致性是一個(gè)比較難的問(wèn)題,但通過(guò)以下手段可以最大程度的保證本地緩存的一致性問(wèn)題。

① 設(shè)置本地緩存短時(shí)間內(nèi)失效

設(shè)置本地緩存短時(shí)間內(nèi)失效,短的存活周期,保證了數(shù)據(jù)的時(shí)效性比較高,當(dāng)數(shù)據(jù)失效之后,再次訪問(wèn)數(shù)據(jù)就會(huì)拉取新的數(shù)據(jù)了,這樣能盡可能的保證數(shù)據(jù)的一致性。

它的特點(diǎn)是:代碼實(shí)現(xiàn)簡(jiǎn)單,不需要寫多余的代碼;缺點(diǎn)是,效果不是很明顯,不適合高并發(fā)的系統(tǒng)。

② 通過(guò)配置中心協(xié)調(diào)和同步

通過(guò)微服務(wù)中的配置中心(例如 Nacos)來(lái)協(xié)調(diào),因?yàn)樗蟹?wù)器都會(huì)連接到配置中心,所以當(dāng)數(shù)據(jù)修改之后,可以修改配置中心的配置,然后配置中心再把配置變更的事件推送給各個(gè)服務(wù),各個(gè)服務(wù)感知到配置中心的配置發(fā)生更改之后,再更新自己的本地緩存,這樣就實(shí)現(xiàn)了本地緩存的數(shù)據(jù)一致性。

③ 本地緩存自動(dòng)更新功能

使用本地緩存框架的自動(dòng)更新功能,例如 Caffeine 中的 refresh 功能來(lái)自動(dòng)刷新緩存,這樣就可以設(shè)置很短的時(shí)間來(lái)更新最新的數(shù)據(jù),從而也能盡可能的保證數(shù)據(jù)的一致性,如下代碼所示:

// 創(chuàng)建 Caffeine 緩存實(shí)例
Cache<String, String> caffeineCache = Caffeine.newBuilder()
// 設(shè)置緩存項(xiàng)在 5s 后開(kāi)始自動(dòng)更新
.refreshAfterWrite(5, TimeUnit.SECONDS)
// 自定義緩存更新邏輯(即獲取新值邏輯)
.build(new CacheLoader<String, String>() {
    @Override
    public void reload(String key, String oldValue) throws Exception {
        // 模擬更新緩存的操作
        updateCache(key, oldValue);
    }
});

2.實(shí)際工作中會(huì)使用哪種方案?

不同的業(yè)務(wù)系統(tǒng),會(huì)采用不同的解決方案,例如以下這些場(chǎng)景和對(duì)應(yīng)的解決方案:

  • 如果對(duì)數(shù)據(jù)一致性要求不是很高,并且程序的并發(fā)壓力不大的情況下,可能使用方案 1,也就是設(shè)置本地緩存短時(shí)間內(nèi)失效的解決方案,因?yàn)樗膶?shí)現(xiàn)最簡(jiǎn)單。
  • 如果對(duì)數(shù)據(jù)的一致性要求極高,且有配置中心的情況下,可使用配置中心協(xié)調(diào)和同步本地緩存。
  • 相反,如果對(duì)一致性要求沒(méi)有那么高,且為高并發(fā)的系統(tǒng),那么可以采用本地緩存的自動(dòng)更新功能來(lái)實(shí)現(xiàn)。

小結(jié)

在多級(jí)緩存中,本地緩存是不可或缺的組成部分,而想要保證本地緩存的數(shù)據(jù)一致性,可能采用:設(shè)置較短的本地緩存過(guò)期時(shí)間、通過(guò)配置中心來(lái)協(xié)調(diào)和同步本地緩存,以及使用本地緩存框架的自動(dòng)更新功能保證數(shù)據(jù)的一致性等解決方案,而不同的業(yè)務(wù)場(chǎng)景,選擇的解決方案也是不同的。

以上就是詳解如何保證Java本地緩存的一致性的詳細(xì)內(nèi)容,更多關(guān)于Java本地緩存的一致性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java String 和StringBuffer的詳解及區(qū)別

    Java String 和StringBuffer的詳解及區(qū)別

    這篇文章主要介紹了Java String 和StringBuffer的詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • mybatis-plus內(nèi)置雪花算法主鍵重復(fù)問(wèn)題解決

    mybatis-plus內(nèi)置雪花算法主鍵重復(fù)問(wèn)題解決

    本文主要介紹了mybatis-plus內(nèi)置雪花算法主鍵重復(fù)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)和電話號(hào)碼的方法

    Java使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)和電話號(hào)碼的方法

    今天小編就為大家分享一篇關(guān)于Java使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)和電話號(hào)碼的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java如何跳過(guò)https的ssl證書驗(yàn)證詳解

    Java如何跳過(guò)https的ssl證書驗(yàn)證詳解

    這篇文章主要介紹了Java跳過(guò)https的ssl證書驗(yàn)證的解決思路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)深入學(xué)習(xí)下吧
    2019-06-06
  • Java中@InitBinder注解的使用原理詳解

    Java中@InitBinder注解的使用原理詳解

    這篇文章主要介紹了Java中@InitBinder注解的使用原理詳解,在Java中,@InitBinder 注解是用于標(biāo)記一個(gè)方法,該方法將在控制器(Controller)處理請(qǐng)求之前被調(diào)用,用于進(jìn)行一些數(shù)據(jù)綁定和預(yù)處理的操作,需要的朋友可以參考下
    2023-10-10
  • java代碼塊之簡(jiǎn)易qq登錄界面及按鈕顏色設(shè)置代碼

    java代碼塊之簡(jiǎn)易qq登錄界面及按鈕顏色設(shè)置代碼

    這篇文章主要介紹了java代碼塊之簡(jiǎn)易qq登錄界面及按鈕顏色設(shè)置代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 利用java生成二維碼工具類示例代碼

    利用java生成二維碼工具類示例代碼

    二維碼對(duì)現(xiàn)在的人們來(lái)說(shuō)再熟悉不過(guò)了,我們?cè)陂_(kāi)發(fā)的時(shí)候也經(jīng)常會(huì)用到二維碼,下面這篇文章主要給大家介紹了關(guān)于利用java生成二維碼工具類的相關(guān)資料,文中給了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • 詳解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)之事件驅(qū)動(dòng)與CQRS

    詳解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)之事件驅(qū)動(dòng)與CQRS

    這篇文章分析了如何應(yīng)用事件來(lái)分離軟件核心復(fù)雜度。探究CQRS為什么廣泛應(yīng)用于DDD項(xiàng)目中,以及如何落地實(shí)現(xiàn)CQRS框架。當(dāng)然我們也要警惕一些失敗的教訓(xùn),利弊分析以后再去抉擇正確的應(yīng)對(duì)之道
    2021-06-06
  • SpringCloud2020 bootstrap 配置文件失效的解決方法

    SpringCloud2020 bootstrap 配置文件失效的解決方法

    這篇文章主要介紹了SpringCloud2020 bootstrap 配置文件失效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java遍歷集合報(bào)錯(cuò)ConcurrentModificationException的原因分析與解決方法

    Java遍歷集合報(bào)錯(cuò)ConcurrentModificationException的原因分析與解決方法

    這篇文章主要為大家詳細(xì)介紹了Java遍歷集合時(shí)報(bào)錯(cuò)ConcurrentModificationException的原因分析與對(duì)應(yīng)的解決方法,一共有三種方法,大家可以根據(jù)自己的情況進(jìn)行選擇
    2025-11-11

最新評(píng)論

花莲县| 邻水| 调兵山市| 长寿区| 什邡市| 额济纳旗| 临澧县| 板桥市| 洞头县| 富顺县| 吴堡县| 仙居县| 电白县| 垫江县| 德令哈市| 江都市| 临朐县| 大竹县| 黑水县| 扶风县| 巨鹿县| 东光县| 镇沅| 三河市| 皮山县| 天柱县| 双桥区| 酒泉市| 益阳市| 沂源县| 樟树市| 西乌珠穆沁旗| 曲周县| 汉中市| 京山县| 余干县| 屏边| 密云县| 隆昌县| 扎赉特旗| 澄江县|