SpringBoot中的ExpiringMap代碼實(shí)例
1、簡(jiǎn)介
ExpiringMap是一個(gè)可以設(shè)置過(guò)期策略、可變條目過(guò)期、延遲條目加載和過(guò)期偵聽(tīng)器的線程安全存儲(chǔ)容器。
2、引入依賴
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.8</version>
</dependency>3、過(guò)期時(shí)間
private static void demo01() throws InterruptedException {
ExpiringMap<String, Object> map = ExpiringMap.builder()
// 過(guò)期時(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("超過(guò)過(guò)期時(shí)間,自動(dòng)刪除");
}
4、重置過(guò)期時(shí)間
private static void demo01_2() throws InterruptedException {
ExpiringMap<String, Object> map = ExpiringMap.builder()
// 允許映射條目具有單獨(dú)的到期日,并允許更改到期日
//.variableExpiration()
// 過(guò)期時(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重置過(guò)期時(shí)間
map.setExpiration("name", 5000, TimeUnit.MILLISECONDS);
}
}
log.info("超過(guò)過(guò)期時(shí)間,自動(dòng)刪除");
}未啟用variableExpiration

啟用variableExpiration

5、過(guò)期策略
ExpirationPolicy.ACCESSED:訪問(wèn)或更新元素時(shí),重置過(guò)期時(shí)間(即過(guò)期時(shí)間重新從零計(jì)算)
ExpirationPolicy.CREATED:創(chuàng)建或更新元素時(shí),重置過(guò)期時(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過(guò)期策略:調(diào)用get、put、replace等方法時(shí),都會(huì)重置過(guò)期時(shí)間;
- CREATED過(guò)期策略:調(diào)用put、replace等方法時(shí),會(huì)重置過(guò)期時(shí)間,get不會(huì)。
6、容器最大值
超過(guò)最大值,最早的元素被移除
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、過(guò)期偵聽(tīng)器
private static void demo04() throws InterruptedException {
ExpiringMap<String, Object> map = ExpiringMap.builder()
.expiration(3000, TimeUnit.MILLISECONDS)
// 同步通知
.expirationListener(((key, value) -> log.info("觸發(fā)過(guò)期偵聽(tīng)器:" + key + " = " + value)))
// 異步通知
.asyncExpirationListener(((key, value) -> log.info("觸發(fā)過(guò)期偵聽(tīng)器:" + 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)文章
Windows下Java調(diào)用OCR進(jìn)行圖片識(shí)別
這篇文章主要為大家詳細(xì)介紹了Windows下Java調(diào)用OCR進(jìn)行圖片識(shí)別,通過(guò)Tesseract-OCR對(duì)圖片進(jìn)行識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
MyBatis-Flex多表關(guān)聯(lián)查詢指南分享
本文介紹了MyBatis-Flex的多表關(guān)聯(lián)查詢功能,包括基于QueryWrapper的動(dòng)態(tài)關(guān)聯(lián)查詢和基于@Relation注解的靜態(tài)關(guān)聯(lián)查詢,通過(guò)示例展示了如何實(shí)現(xiàn)不同類型的關(guān)聯(lián)關(guān)系,并對(duì)比了兩種方式的特點(diǎn)和適用場(chǎng)景,最后給出了最佳實(shí)踐建議2026-05-05
Springboot+Spring Security實(shí)現(xiàn)前后端分離登錄認(rèn)證及權(quán)限控制的示例代碼
本文主要介紹了Springboot+Spring Security實(shí)現(xiàn)前后端分離登錄認(rèn)證及權(quán)限控制的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Springboot項(xiàng)目使用html5的video標(biāo)簽完成視頻播放功能
這篇文章主要介紹了Springboot項(xiàng)目使用html5的video標(biāo)簽完成視頻播放功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
springcloud?eureka切換nacos的配置方法
這篇文章主要介紹了springcloud?eureka切換nacos,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01

