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

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

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

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

1、concurrentHashMap本身是線程安全的

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

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

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

難點(diǎn)一

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

難點(diǎn)二

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

場景:

  • 消費(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ā)的。可能add判斷為true之后,正要放入緩存,destory才將flag置成flase,也會(huì)丟失少量消息。
  • 如果使用CountDownLatch,等add把消息全部放入緩存之后,再執(zhí)行uploadAll,把緩存全部刷,進(jìn)行清理。關(guān)鍵是把countDownLatch的初始值設(shè)為多少呢?

總結(jié)

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

相關(guān)文章

  • SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決

    SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決

    這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java十分鐘精通異常處理機(jī)制

    Java十分鐘精通異常處理機(jī)制

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會(huì)根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機(jī)制是我們java語言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力,程序出現(xiàn)的錯(cuò)誤,程序可以安全的退出,以保證程序正常的運(yùn)行等
    2022-03-03
  • Java淺析代碼塊與構(gòu)造塊及靜態(tài)塊三者之間的關(guān)系

    Java淺析代碼塊與構(gòu)造塊及靜態(tài)塊三者之間的關(guān)系

    所謂代碼塊是指用"{}"括起來的一段代碼,根據(jù)其位置和聲明的不同,可以分為普通代碼塊、構(gòu)造塊、靜態(tài)塊、和同步代碼塊。如果在代碼塊前加上synchronized關(guān)鍵字,則此代碼塊就成為同步代碼塊
    2022-07-07
  • springboot根據(jù)實(shí)體類生成表的實(shí)現(xiàn)方法

    springboot根據(jù)實(shí)體類生成表的實(shí)現(xiàn)方法

    本文介紹了如何通過SpringBoot工程引入SpringDataJPA,并通過實(shí)體類自動(dòng)生成數(shù)據(jù)庫表的過程,包括常見問題解決方法,感興趣的可以了解一下
    2024-09-09
  • Java實(shí)現(xiàn)遞歸查詢樹結(jié)構(gòu)的示例代碼

    Java實(shí)現(xiàn)遞歸查詢樹結(jié)構(gòu)的示例代碼

    我們在實(shí)際開發(fā)中,肯定會(huì)用到樹結(jié)構(gòu),如部門樹、菜單樹等等。Java后臺(tái)利用遞歸思路進(jìn)行構(gòu)建樹形結(jié)構(gòu)數(shù)據(jù),返回給前端,能以下拉菜單等形式進(jìn)行展示。今天,咱們就來說說怎么樣將List集合轉(zhuǎn)換成TreeList
    2022-11-11
  • Spring AOP定義Before增加實(shí)戰(zhàn)案例詳解

    Spring AOP定義Before增加實(shí)戰(zhàn)案例詳解

    這篇文章主要介紹了Spring AOP定義Before增加,結(jié)合實(shí)例形式詳細(xì)分析了Spring面向切面AOP定義Before增加相關(guān)定義與使用技巧,需要的朋友可以參考下
    2020-01-01
  • SpringBoot打印系統(tǒng)執(zhí)行的sql語句及日志配置指南

    SpringBoot打印系統(tǒng)執(zhí)行的sql語句及日志配置指南

    這篇文章主要給大家介紹了關(guān)于SpringBoot打印系統(tǒng)執(zhí)行的sql語句及日志配置的相關(guān)資料,在Java SpringBoot項(xiàng)目中如果使用了Mybatis框架,默認(rèn)情況下執(zhí)行的所有SQL操作都不會(huì)打印日志,需要的朋友可以參考下
    2023-10-10
  • SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloud Eureka 提供者及調(diào)用者的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 解決springboot自定義配置Boolean屬性不能生效的問題

    解決springboot自定義配置Boolean屬性不能生效的問題

    這篇文章主要介紹了解決springboot自定義配置Boolean屬性不能生效的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • JAVA面試題 start()和run()詳解

    JAVA面試題 start()和run()詳解

    這篇文章主要介紹了JAVA面試題 啟動(dòng)線程是start()還是run()?為什么?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評論

静海县| 金乡县| 大荔县| 长丰县| 伽师县| 灵山县| 邵阳市| 翁牛特旗| 灵山县| 仙桃市| 武宣县| 沂南县| 前郭尔| 车险| 定结县| 沙雅县| 林周县| 丽江市| 乌审旗| 永康市| 沁水县| 成武县| 雷山县| 阿克陶县| 江城| 呼图壁县| 南通市| 福建省| 江口县| 渭源县| 广宁县| 利川市| 建始县| 宜宾县| 涟水县| 乐至县| 乐都县| 清镇市| 哈尔滨市| 噶尔县| 孟津县|