目录
1、功能简介
- 可设置Map中的Entry在一段时间后自动过期。
- 可设置Map最大容纳值,当到达Maximum size后,再次插入值会导致Map中的第一个值过期。
- 可添加监听事件,在监听到Entry过期时调度监听函数。
- 可以设置懒加载,在调用get()方法时创建对象。
2、使用说明
Maven
<!-- https://mvnrepository.com/artifact/net.jodah/expiringmap -->
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.8</version>
</dependency>
3、详细介绍
3.1 设置过期时间与过期协议
/**
* expiration(5000,TimeUnit.MILLISECONDS)
* 设置过期时间为5秒
* ExpirationPolicy.CREATED)
* 设置过期策略为创建或更新值后
*/
public static void main(String[] args) throws InterruptedException {
ExpiringMap<String, String> map = ExpiringMap
.builder()
.expiration(5000, TimeUnit.MILLISECONDS)
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
map.put("key", "value");
System.out.println("key:" + map.get("key")); // 输出:key:value
//等待5秒
Thread.sleep(5001);
System.out.println(map.get("key")); // 输出:null
}
- 过期协议:ExpirationPolicy.CREATED
在每次更新元素时,key的过期时间会进行重置。
public static void main(String[] args) throws InterruptedException {
ExpiringMap<String, String> map = ExpiringMap
.builder()
.expiration(5000, TimeUnit.MILLISECONDS)
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
map.put("key", "value");
System.out.println(map.get("key")); // 输出:value
Thread.sleep(4000);
System.out.println("访问map:" + map.get("key")); // 输出:访问 map:value
Thread.sleep(1001);
System.out.println(map.get("key")); // 输出:null
}
在过期时间内调用map.put()、map.replace()
更新操作后重置:
public static void main(String[] args) throws InterruptedException {
ExpiringMap<String, String> map = ExpiringMap
.builder()
.expiration(5000, TimeUnit.MILLISECONDS)
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
map.put("key", "value");
System.out.println(map.get("key")); // 输出:value
Thread.sleep(4000);
map.put("key", "value2");
System.out.println("更新map:" + map.get("key")); // 输出:更新map:value2
Thread.sleep(1001);
System.out.println(map.get("key")); // 输出:value2
}
- 过期协议:ExpirationPolicy.ACCESSED
在每次访问元素时,key的过期时间会重置。
public static void main(String[] args) throws InterruptedException {
ExpiringMap<String, String> map = ExpiringMap
.builder()
.expiration(5000, TimeUnit.MILLISECONDS)
.expirationPolicy(ExpirationPolicy.ACCESSED)
.build();
map.put("key", "value");
System.out.println(map.get("key")); // 输出:value
Thread.sleep(4000);
System.out.println("访问map:" + map.get("key")); // 输出:访问map:value
Thread.sleep(1001);
System.out.println(map.get("key")); // 输出:value
}
3.2 为Map中单个元素设置过期时间
public static void main(String[] args) throws InterruptedException {
ExpiringMap<String, String> map = ExpiringMap
.builder()
.variableExpiration()
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
map.put("key1", "value1", ExpirationPolicy.ACCESSED, 5000, TimeUnit.MILLISECONDS);
map.put("key2", "value2", 10000, TimeUnit.MILLISECONDS);
Thread.sleep(5001);
System.out.println("key1:" + map.get("key1")); // 输出:key1:null
System.out.println("key2:" + map.get("key2")); // 输出:key2:value2
Thread.sleep(5000);
System.out.println("key2:" + map.get("key2")); // 输出:key2:null
}
3.3设置ExpiringMap的Maximum size
类似队列,容量固定,当操作map容量超出限制时,最开始那个就会依次过期,只保留最新的10个
public static void main(String[] args) {
//Maximum size设置为10个
ExpiringMap<String, String> map = ExpiringMap.builder()
.maxSize(10)
.build();
//向map中插入10个数
for (int i = 0; i < 10; i++) {
map.put("a:" + i, "v:" + i);
}
System.out.println("a:0未过期:" + map.get("a:0")); // 输出:a:0未过期:v:0
System.out.println("插入a:10后"); // 输出:插入a:10后
map.put("a:10", "v:10");
System.out.println("a:0过期:" + map.get("a:0")); // 输出:a:0过期:null
System.out.println("a:1未过期:" + "a:1"); // 输出:a:1未过期:a:1
}
3.4 设置过期监听事件
public static void main(String[] args) throws InterruptedException {
ExpiringMap<String, String> map = ExpiringMap
.builder()
.variableExpiration()
.expirationListener((theKey, theValue) -> {
System.out.println("theKey:" + theKey + "过期"); // 输出:theKey:theKey过期
})
.build();
map.put("theKey", "theValue", 5000, TimeUnit.MILLISECONDS);
Thread.sleep(5001);
System.out.println("theKey:" + map.get("theKey")); // 输出:theKey:null
}
3.5 在运行时添加/删除监听
public static void main(String[] args) throws InterruptedException {
ExpiringMap<String, String> map = ExpiringMap.builder().variableExpiration().build();
ExpirationListener<String, String> expirationListener = ((theKey, theValue) -> {
System.out.println("过期监听事件" + "key:" + theKey + " value:" + theValue);
// 输出:过期监听事件key:key value:value
});
map.put("key", "value", ExpirationPolicy.CREATED, 5000, TimeUnit.MILLISECONDS);
//添加监听
map.addExpirationListener(expirationListener);
// 等待key过期
Thread.sleep(5001);
//清除监听
map.removeExpirationListener(expirationListener);
}
3.5懒加载
使用懒加载模式时,可以不用去向map中put对象,在调用get方法时自动去创建对象。
static class Connection {
String ipAddress;
public Connection(String ipAddress) {
this.ipAddress = ipAddress;
}
}
public static void main(String[] args) throws InterruptedException {
Map<String, Connection> map = ExpiringMap
.builder()
.expiration(5000, TimeUnit.MILLISECONDS)
.expirationListener((theKey, theValue) -> {
System.out.println("过期key:" + theKey);
// 输出:过期key:127.0.0.18
})
.entryLoader(address -> new Connection((String) address))
.build();
System.out.println(map.get("127.0.0.1"));
// 输出:com.daqsoft.qionghai.warn.WarnEventListener$Connection@6a2bcfcb
Thread.sleep(5001);
}