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

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

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

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

1、concurrentHashMap本身是線程安全的

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

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

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

難點(diǎn)一

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

難點(diǎn)二

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

場(chǎng)景:

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

難點(diǎn)三

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    java date類與string類實(shí)例代碼分享

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

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

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

最新評(píng)論