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

使用concurrentHashMap如何實現(xiàn)緩存

 更新時間:2025年02月19日 11:27:39   作者:蝸牛^^O^  
文章介紹了使用ConcurrentHashMap實現(xiàn)緩存的線程安全性和初始化方法,以及如何處理高并發(fā)場景下的緩存清理和數(shù)據(jù)一致性問題,包括分桶、使用ConcurrentLinkedQueue以及使用CountDownLatch來確保緩存數(shù)據(jù)的不丟失

使用concurrentHashMap實現(xiàn)緩存

1、concurrentHashMap本身是線程安全的

2、使用@PostConstruct注解init函數(shù),在生成bean的時候會調用init函數(shù)。init函數(shù)進行concurrenthashMap的初始化,分配初始空間大小。并且開啟線程每隔一段時間處理清空緩存,flushAlll。

3、如果一個key需要存多條消息,并發(fā)很高,可以考慮分桶,使用多個concurrentHashMap,根據(jù)key來決定放到那個Map保存,Map里面使用另外的key進行散列。

4、add向緩存添加元素,map元素個數(shù)大于閾值,則進行緩存處理清理

難點一

  • 緩存需要讀多寫多,高并發(fā)。
  • 使用concurrentHashMap比較合適,根據(jù)id來散列,id相同的消息多個,所以concurrentHashMap的val應該是一個線程安全,并且并發(fā)效率好的集合。
  • 使用ConcurrentLinkedQueue。

難點二

上線發(fā)布,需要重啟機器,緩存實例被銷毀,怎么做到緩存的不丟失?

場景:

  • 消費mq,放到緩存。
  • 使用@BeforeDestory,void destory函數(shù)中,將flag置成flase,緩存添加函數(shù)add,先判斷flag如果為flase,直接拋出異常,mq不確認ack。
  • flag應該是volatile的。

難點三

  • destory函數(shù)將flag置成flase,add函數(shù)根據(jù)flag判斷,add是高并發(fā)的。可能add判斷為true之后,正要放入緩存,destory才將flag置成flase,也會丟失少量消息。
  • 如果使用CountDownLatch,等add把消息全部放入緩存之后,再執(zhí)行uploadAll,把緩存全部刷,進行清理。關鍵是把countDownLatch的初始值設為多少呢?

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MyBatis-Plus聯(lián)表查詢及分頁代碼舉例

    MyBatis-Plus聯(lián)表查詢及分頁代碼舉例

    本文介紹了mybatis-plus-join工具的使用,該工具可以簡化mybatis-plus的聯(lián)表查詢,使得開發(fā)者可以以類似QueryWrapper的方式進行聯(lián)表查詢,無需手動編寫xml文件,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • SpringBoot Redis配置多數(shù)據(jù)源的項目實踐

    SpringBoot Redis配置多數(shù)據(jù)源的項目實踐

    springboot中默認的redis配置是只能對單個redis庫進行操作的, 那么我們需要多個庫操作的時候這個時候就可以采用redis多數(shù)據(jù)源 ,本文就介紹了SpringBoot Redis配置多數(shù)據(jù)源,感興趣的可以了解一下
    2023-07-07
  • java控制臺輸出數(shù)字金字塔示例分享

    java控制臺輸出數(shù)字金字塔示例分享

    這篇文章主要介紹了java控制臺輸出數(shù)字金字塔的示例,控制臺輸出的缺陷是數(shù)字不能完全居中,只能右對齊或左對齊,大家參考使用吧
    2014-01-01
  • Java基于解釋器模式實現(xiàn)定義一種簡單的語言功能示例

    Java基于解釋器模式實現(xiàn)定義一種簡單的語言功能示例

    這篇文章主要介紹了Java基于解釋器模式實現(xiàn)定義一種簡單的語言功能,簡單描述了解釋器模式的概念、功能及Java使用解釋器模式定義一種簡單語言的相關實現(xiàn)與使用技巧,需要的朋友可以參考下
    2018-05-05
  • 圖文詳解Maven工程打jar包的N種方式

    圖文詳解Maven工程打jar包的N種方式

    最近在打包maven項目時,該項目中僅有一個測試類,想打成jar包運行測試,所以下面這篇文章主要給大家介紹了關于Maven工程打jar包的N種方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Java 將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法

    Java 將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法

    本篇文章主要是對Java將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • 一文詳解如何指定Maven的JDK版本

    一文詳解如何指定Maven的JDK版本

    這篇文章主要介紹了如何修改Maven的可執(zhí)行文件以指定JDK版本,并驗證Maven是否使用了正確的JDK版本,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • 在Linux上搭建一個Java部署環(huán)境的詳細步驟

    在Linux上搭建一個Java部署環(huán)境的詳細步驟

    這篇文章主要介紹了在Linux上搭建一個Java部署環(huán)境,安裝jdk有很多種方式,但是我們這里推薦的是使用yum直接安裝openjdk,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • java date類與string類實例代碼分享

    java date類與string類實例代碼分享

    這篇文章主要介紹了java date類與string類實例代碼分享,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 基于Spring boot @Value 注解注入屬性值的操作方法

    基于Spring boot @Value 注解注入屬性值的操作方法

    這篇文章主要介紹了結合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論