欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

那么,問題來了,怎么保證本地緩存的一致性?

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

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

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

① 設置本地緩存短時間內失效

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

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

② 通過配置中心協(xié)調和同步

通過微服務中的配置中心(例如 Nacos)來協(xié)調,因為所有服務器都會連接到配置中心,所以當數(shù)據(jù)修改之后,可以修改配置中心的配置,然后配置中心再把配置變更的事件推送給各個服務,各個服務感知到配置中心的配置發(fā)生更改之后,再更新自己的本地緩存,這樣就實現(xiàn)了本地緩存的數(shù)據(jù)一致性。

③ 本地緩存自動更新功能

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

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

2.實際工作中會使用哪種方案?

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

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

小結

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

以上就是詳解如何保證Java本地緩存的一致性的詳細內容,更多關于Java本地緩存的一致性的資料請關注腳本之家其它相關文章!

相關文章

  • java操作XML實例代碼

    java操作XML實例代碼

    這篇文章主要介紹了java操作XML實例代碼,有需要的朋友可以參考一下
    2014-01-01
  • Spring Cloud Admin健康檢查 郵件、釘釘群通知的實現(xiàn)

    Spring Cloud Admin健康檢查 郵件、釘釘群通知的實現(xiàn)

    這篇文章主要介紹了Spring Cloud Admin健康檢查 郵件、釘釘群通知的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Java pom.xml parent引用報錯問題解決方案

    Java pom.xml parent引用報錯問題解決方案

    這篇文章主要介紹了Java pom.xml parent引用報錯問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 分布式任務調度xxl-job問題解決

    分布式任務調度xxl-job問題解決

    這篇文章主要為大家介紹了分布式任務調度xxl-job的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多多多進步,早日升職加薪
    2022-03-03
  • java調用python代碼的兩種實現(xiàn)方式:Runtime.exec()和Jython

    java調用python代碼的兩種實現(xiàn)方式:Runtime.exec()和Jython

    在Java中調用Python代碼有多種方法,包括使用Runtime.exec()和第三方庫如Jython,Runtime.exec()通過系統(tǒng)命令執(zhí)行Python腳本,適用于簡單的調用場景,Jython則是一個Python的Java實現(xiàn),允許在Java中直接運行Python代碼,適用于更深層次的集成需求
    2025-01-01
  • Java輸入輸出流實例詳解

    Java輸入輸出流實例詳解

    這篇文章主要介紹了Java輸入輸出流,結合實例形式詳細分析了Java常見的輸入輸出常用操作技巧與相關注意事項,需要的朋友可以參考下
    2018-09-09
  • Java多線程解決龜兔賽跑問題詳解

    Java多線程解決龜兔賽跑問題詳解

    這篇文章主要為大家詳細介紹了Java如何使用線程休眠模擬龜兔賽跑比賽問題,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-08-08
  • SpringBoot 在測試時如何指定包的掃描范圍

    SpringBoot 在測試時如何指定包的掃描范圍

    這篇文章主要介紹了SpringBoot 在測試時如何指定包的掃描范圍,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java高性能緩存框架之Caffeine詳解

    Java高性能緩存框架之Caffeine詳解

    這篇文章主要介紹了Java高性能緩存框架之Caffeine詳解,Caffeine是一個基于Java8的高性能緩存框架,號稱趨于完美,Caffeine受啟發(fā)于Guava?Cache的API,使用API和Guava是一致的,需要的朋友可以參考下
    2023-12-12
  • SpringBoot日志注解與緩存優(yōu)化詳解

    SpringBoot日志注解與緩存優(yōu)化詳解

    這篇文章主要給大家介紹了關于SpringBoot日志注解與緩存優(yōu)化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-10-10

最新評論