使用concurrentHashMap如何實(shí)現(xiàn)緩存
使用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)一
- 緩存需要讀多寫(xiě)多,高并發(fā)。
- 使用concurrentHashMap比較合適,根據(jù)id來(lái)散列,id相同的消息多個(gè),所以concurrentHashMap的val應(yīng)該是一個(gè)線程安全,并且并發(fā)效率好的集合。
- 使用ConcurrentLinkedQueue。
難點(diǎn)二
上線發(fā)布,需要重啟機(jī)器,緩存實(shí)例被銷(xiāo)毀,怎么做到緩存的不丟失?
場(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)文章
SpringBoot 配置文件中配置的中文,程序讀取出來(lái)是亂碼的解決
這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來(lái)是亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java淺析代碼塊與構(gòu)造塊及靜態(tài)塊三者之間的關(guān)系
所謂代碼塊是指用"{}"括起來(lái)的一段代碼,根據(jù)其位置和聲明的不同,可以分為普通代碼塊、構(gòu)造塊、靜態(tài)塊、和同步代碼塊。如果在代碼塊前加上synchronized關(guān)鍵字,則此代碼塊就成為同步代碼塊2022-07-07
springboot根據(jù)實(shí)體類(lèi)生成表的實(shí)現(xiàn)方法
本文介紹了如何通過(guò)SpringBoot工程引入SpringDataJPA,并通過(guò)實(shí)體類(lèi)自動(dòng)生成數(shù)據(jù)庫(kù)表的過(guò)程,包括常見(jiàn)問(wèn)題解決方法,感興趣的可以了解一下2024-09-09
Java實(shí)現(xiàn)遞歸查詢(xún)樹(shù)結(jié)構(gòu)的示例代碼
我們?cè)趯?shí)際開(kāi)發(fā)中,肯定會(huì)用到樹(shù)結(jié)構(gòu),如部門(mén)樹(shù)、菜單樹(shù)等等。Java后臺(tái)利用遞歸思路進(jìn)行構(gòu)建樹(shù)形結(jié)構(gòu)數(shù)據(jù),返回給前端,能以下拉菜單等形式進(jìn)行展示。今天,咱們就來(lái)說(shuō)說(shuō)怎么樣將List集合轉(zhuǎn)換成TreeList2022-11-11
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語(yǔ)句及日志配置指南
這篇文章主要給大家介紹了關(guān)于SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置的相關(guān)資料,在Java SpringBoot項(xiàng)目中如果使用了Mybatis框架,默認(rèn)情況下執(zhí)行的所有SQL操作都不會(huì)打印日志,需要的朋友可以參考下2023-10-10
SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud Eureka 提供者及調(diào)用者的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
解決springboot自定義配置Boolean屬性不能生效的問(wèn)題
這篇文章主要介紹了解決springboot自定義配置Boolean屬性不能生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

