功能简介
- 可设置Map中的Entry在一段时间后自动过期,key过期 value同时会过期。
- 可设置Map最大容纳值,当到达Maximum size后,再次插入值会导致Map中的第一个值过期。
- 可添加监听事件,在监听到Entry过期时调度监听函数。
- 可以设置懒加载,在调用get()方法时创建对象。
- 可以设置过期策略:
- ExpirationPolicy.CREATED:在每次更新元素时,过期时间同时清零。
- ExpirationPolicy.ACCESSED:在每次访问元素时,过期时间同时清零. 暂时未用到
添加依赖
maven
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.8</version>
</dependency>
gradle
compile group: 'net.jodah', name: 'expiringmap', version: '0.5.8'
过期策略ExpirationPolicy.CREATED
/**
* 默认5000毫秒失效 时间单位可以自定义 过期策略ExpirationPolicy.CREATED
*/
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"));
//等待5秒
Thread.sleep(5001);
System.out.println(map.get("key"));
执行结果:
key:value
null
过期策略ExpirationPolicy.CREATED
/**
* 更详细的观察
*/
ExpiringMap<String, String> map = ExpiringMap.builder().expiration(5000,TimeUnit.MILLISECONDS)
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
map.put("key","value");
System.out.println(map.get("key"));
Thread.sleep(4000);
System.out.println("访问map:"+map.get("key"));
Thread.sleep(1001);
System.out.println(map.get("key"));
执行结果
value
访问map:value
null
在过期时间内put同个key 不同的value 将会重新开始计算时间
ExpiringMap<String, String> map = ExpiringMap.builder().expiration(3, TimeUnit.SECONDS)
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
map.put("key","value");
Thread.sleep(2000);
map.put("key","valu2");
System.out.println("更新value=" + map.get("key"));
Thread.sleep(1001);
if (map.containsKey("key")) {
map.remove("key");
System.out.println("删除 key ");
}
执行结果
更新value=value2
删除 key
在过期时间内put同个key 同个value 不会重新开始计算时间
ExpiringMap<String, String> map = ExpiringMap.builder().expiration(3, TimeUnit.SECONDS)
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
map.put("key","value");
Thread.sleep(2000);
map.put("key","value");
System.out.println("更新value=" + map.get("key"));
Thread.sleep(1001);
if (map.containsKey("key")) {
map.remove("key");
System.out.println("删除 key ");
}
执行结果
更新value=value
为Map中单个元素设置过期时间
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"));
System.out.println("key2:"+map.get("key2"));
Thread.sleep(5000);
System.out.println("key2:"+map.get("key2"));
执行结果
key1:null
key2:value2
key2:null
为map设置最大数量
//Maximum size设置为10个
Map<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("第一个key a:0未过期:"+map.get("a:0"));
// 插入第10个key后 第一个key过期
map.put("a:10","v:10");
System.out.println("第一个key a:0过期:"+map.get("a:0"));
System.out.println("第二个key a:1未过期:"+map.get("a:1"));
执行结果
第一个key a:0未过期:v:0
第一个key a:0过期:null
第二个key a:1未过期:v:1
过期监听事件
ExpiringMap<String,String> map = ExpiringMap.builder().variableExpiration()
.expirationListener((thekey, thevalue) -> {
System.out.println("key:"+thekey+"过期");
}).build();
map.put("key","value", 5000, TimeUnit.MILLISECONDS);
Thread.sleep(5001);
System.out.println("key:"+map.get("key"));
执行结果
key:key过期
key:null
运行时添加或删除监听事件
ExpiringMap<String,String> map = ExpiringMap.builder().
variableExpiration().
build();
ExpirationListener<String,String> expirationListener = ((theKey,theValue)->{
System.out.println("过期监听事件"+"key:"+theKey+" value:"+theValue);
});
map.put("key","value",ExpirationPolicy.CREATED,5000,TimeUnit.MILLISECONDS);
//添加监听
map.addExpirationListener(expirationListener);
Thread.sleep(5001);
//清除监听
map.removeExpirationListener(expirationListener);
执行结果
过期监听事件key:key value:value
懒加载
Map<String, Connection> map = ExpiringMap.builder()
.expiration(5000, TimeUnit.MILLISECONDS)
.expirationListener((theKey,theValue)->{
System.out.println("过期key:"+theKey);
})
.entryLoader(address -> new Connection((String) address))
.build();
System.out.println(map.get("127.0.0.1"));
Thread.sleep(5001);
执行结果
com.zhizhou.netty.SocketChannelMapTest$1Connection@b1e9b8
过期key:127.0.0.1