SpringBoot中的ExpiringMap代碼實(shí)例
1、簡(jiǎn)介
ExpiringMap是一個(gè)可以設(shè)置過期策略、可變條目過期、延遲條目加載和過期偵聽器的線程安全存儲(chǔ)容器。
2、引入依賴
<dependency> <groupId>net.jodah</groupId> <artifactId>expiringmap</artifactId> <version>0.5.8</version> </dependency>
3、過期時(shí)間
private static void demo01() throws InterruptedException { ExpiringMap<String, Object> map = ExpiringMap.builder() // 過期時(shí)間:5000,單位毫秒 .expiration(5000, TimeUnit.MILLISECONDS) .build(); log.info("添加元素"); map.put("name", "yzm"); while (map.containsKey("name")) { log.info("name = " + map.get("name")); Thread.sleep(1000); } log.info("超過過期時(shí)間,自動(dòng)刪除"); }
4、重置過期時(shí)間
private static void demo01_2() throws InterruptedException { ExpiringMap<String, Object> map = ExpiringMap.builder() // 允許映射條目具有單獨(dú)的到期日,并允許更改到期日 //.variableExpiration() // 過期時(shí)間:5000,單位毫秒 .expiration(5000, TimeUnit.MILLISECONDS) .build(); log.info("添加元素"); map.put("name", "yzm"); int count = 0; while (map.containsKey("name")) { count++; log.info("name = " + map.get("name")); Thread.sleep(1000); if (count == 4) { //指定key重置過期時(shí)間 map.setExpiration("name", 5000, TimeUnit.MILLISECONDS); } } log.info("超過過期時(shí)間,自動(dòng)刪除"); }
未啟用variableExpiration
啟用variableExpiration
5、過期策略
ExpirationPolicy.ACCESSED:訪問或更新元素時(shí),重置過期時(shí)間(即過期時(shí)間重新從零計(jì)算)
ExpirationPolicy.CREATED:創(chuàng)建或更新元素時(shí),重置過期時(shí)間。默認(rèn)策略。
private static void demo02() throws InterruptedException { ExpiringMap<String, Object> map = ExpiringMap.builder() .variableExpiration() .expiration(5000, TimeUnit.MILLISECONDS) .expirationPolicy(ExpirationPolicy.ACCESSED) .build(); log.info("添加元素"); map.put("name", "yzm"); int count = 0; while (map.containsKey("name")) { count++; log.info("name = " + map.get("name")); Thread.sleep(1000); if (count > 10) { break; } } log.info("count:" + count); }
private static void demo02() throws InterruptedException { ExpiringMap<String, Object> map = ExpiringMap.builder() .variableExpiration() .expiration(5000, TimeUnit.MILLISECONDS) .expirationPolicy(ExpirationPolicy.ACCESSED) .build(); log.info("添加元素"); map.put("name", "yzm"); int count = 0; while (map.containsKey("name")) { count++; //log.info("name = " + map.get("name")); Thread.sleep(1000); if (count == 4) { map.replace("name", "Yzm"); } } log.info("count:" + count); }
經(jīng)測(cè)試,
- ACCESSED過期策略:調(diào)用get、put、replace等方法時(shí),都會(huì)重置過期時(shí)間;
- CREATED過期策略:調(diào)用put、replace等方法時(shí),會(huì)重置過期時(shí)間,get不會(huì)。
6、容器最大值
超過最大值,最早的元素被移除
private static void demo03() throws InterruptedException { ExpiringMap<Integer, Object> map = ExpiringMap.builder() .maxSize(5) .build(); for (int i = 1; i <= 10; i++) { map.put(i, i); System.out.println(map.keySet()); Thread.sleep(1000); } }
7、過期偵聽器
private static void demo04() throws InterruptedException { ExpiringMap<String, Object> map = ExpiringMap.builder() .expiration(3000, TimeUnit.MILLISECONDS) // 同步通知 .expirationListener(((key, value) -> log.info("觸發(fā)過期偵聽器:" + key + " = " + value))) // 異步通知 .asyncExpirationListener(((key, value) -> log.info("觸發(fā)過期偵聽器:" + key + " = " + value))) .build(); log.info("添加元素"); map.put("name", "yzm"); map.put("name2", "yzm2"); map.put("name3", "yzm3"); Thread.sleep(10000); }
8、單個(gè)元素配置
private static void demo05() throws InterruptedException { ExpiringMap<String, Object> map = ExpiringMap.builder().variableExpiration().build(); map.put("key", "value", ExpirationPolicy.CREATED, 3, TimeUnit.SECONDS); while (map.containsKey("key")) { log.info("key = " + map.get("key")); Thread.sleep(1000); } }
到此這篇關(guān)于SpringBoot中的ExpiringMap代碼實(shí)例的文章就介紹到這了,更多相關(guān)SpringBoot的ExpiringMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
談?wù)凧ava中try-catch-finally中的return語(yǔ)句
我們知道return語(yǔ)句用在某一個(gè)方法中,一是用于返回函數(shù)的執(zhí)行結(jié)果,二是用于返回值為void類型的函數(shù)中,僅僅是一個(gè)return語(yǔ)句(return ;),此時(shí)用于結(jié)束方法的執(zhí)行,也即此return后的語(yǔ)句將不會(huì)被執(zhí)行,當(dāng)然,這種情況下return語(yǔ)句后不能再有其它的語(yǔ)句了2016-01-01spring boot的健康檢查HealthIndicators實(shí)戰(zhàn)
這篇文章主要介紹了spring boot的健康檢查HealthIndicators實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java應(yīng)用程序CPU100%問題排查優(yōu)化實(shí)戰(zhàn)
這篇文章主要介紹了如何排查和優(yōu)化Java應(yīng)用程序CPU使用率達(dá)到100%的問題,文中通過代碼示例和圖文結(jié)合的方式講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2025-02-02Maven如何解決添加依賴之后沒有加載jar包報(bào)錯(cuò)問題
這篇文章主要介紹了Maven如何解決添加依賴之后沒有加載jar包報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Java Class.forName()用法和newInstance()方法原理解析
這篇文章主要介紹了Java Class.forName()用法和newInstance()方法原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08springboot大文件上傳、分片上傳、斷點(diǎn)續(xù)傳、秒傳的實(shí)現(xiàn)
本文主要介紹了springboot大文件上傳、分片上傳、斷點(diǎn)續(xù)傳、秒傳的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07SpringBoot整合Hutool實(shí)現(xiàn)文件上傳的使用示例
文件上傳在項(xiàng)目經(jīng)常會(huì)用到,本文主要介紹了SpringBoot整合Hutool實(shí)現(xiàn)文件上傳的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Java獲取本機(jī)IP地址的方法代碼示例(內(nèi)網(wǎng)、公網(wǎng))
在IT領(lǐng)域獲取本機(jī)IP地址是一項(xiàng)基礎(chǔ)但重要的任務(wù),特別是在網(wǎng)絡(luò)編程、遠(yuǎn)程協(xié)作和設(shè)備通信中,這篇文章主要給大家介紹了關(guān)于Java獲取本機(jī)IP地址的方法(內(nèi)網(wǎng)、公網(wǎng)),需要的朋友可以參考下2024-07-07druid配置數(shù)據(jù)庫(kù)連接使用密文密碼方式
這篇文章主要介紹了druid配置數(shù)據(jù)庫(kù)連接使用密文密碼方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-12-12