使用concurrentHashMap如何實現(xiàn)緩存
使用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的初始值設為多少呢?
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot Redis配置多數(shù)據(jù)源的項目實踐
springboot中默認的redis配置是只能對單個redis庫進行操作的, 那么我們需要多個庫操作的時候這個時候就可以采用redis多數(shù)據(jù)源 ,本文就介紹了SpringBoot Redis配置多數(shù)據(jù)源,感興趣的可以了解一下2023-07-07Java基于解釋器模式實現(xiàn)定義一種簡單的語言功能示例
這篇文章主要介紹了Java基于解釋器模式實現(xiàn)定義一種簡單的語言功能,簡單描述了解釋器模式的概念、功能及Java使用解釋器模式定義一種簡單語言的相關實現(xiàn)與使用技巧,需要的朋友可以參考下2018-05-05Java 將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法
本篇文章主要是對Java將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01在Linux上搭建一個Java部署環(huán)境的詳細步驟
這篇文章主要介紹了在Linux上搭建一個Java部署環(huán)境,安裝jdk有很多種方式,但是我們這里推薦的是使用yum直接安裝openjdk,本文給大家介紹的非常詳細,需要的朋友可以參考下2023-01-01基于Spring boot @Value 注解注入屬性值的操作方法
這篇文章主要介紹了結合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07