一、ExpiringMap
具有高性能、低开销、零依赖、线程安全、使用 ConcurrentMap 的实现过期 entries 等优点。
其主要特点包括:过期策略、可变有效期、最大尺寸、侦听器过期、延迟输入加载、过期自省等。
二、基本功能
1、可设置 Map 中的 Entry 在一段时间后自动过期。
2、可设置 Map 最大容纳值,当到达 Maximum size 后,再次插入值会导致 Map 中的第一个值过期。
3、可添加监听事件,在监听到 Entry 过期时调度监听函数。
4、可以设置懒加载,在调用 get() 方法时创建对象。
三、使用方式
1、pom.xml 中添加依赖
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.8</version>
</dependency>
2、创建静态方法
public class CacheUtils {
/**
* 缓存用户信息
*/
public static final ExpiringMap<String, String> USER_INFO_MAP = ExpiringMap.builder()
.maxSize(1000)
.expiration(12, TimeUnit.HOURS)
.variableExpiration()
.expirationPolicy(ExpirationPolicy.ACCESSED)
.build();
/**
* 缓存车牌颜色信息
*/
public static final ExpiringMap<Integer, String> PLATE_COLOR_MAP = ExpiringMap.builder()
.maxSize(1000)
.expiration(24, TimeUnit.HOURS)
.variableExpiration()
.expirationListener((key,value) -> {
System.out.println("key:" + key + "已过期……");
})
.expirationPolicy(ExpirationPolicy.ACCESSED)
.build();
}
① maxSize:Map存储的最大值,类似队列,容量固定,当操作map容量超出限制时,最开始的元素就会依次过期,只保留最新的;
② expiration:过期时间;
③ expirationListener:过期监听;
④ expirationPolicy:过期策略,包括 ExpirationPolicy.ACCESSED 和 ExpirationPolicy.CREATED 两种;
1)ExpirationPolicy.ACCESSED :每进行一次访问,过期时间就会自动清零,重新计算;
2)ExpirationPolicy.CREATED:在过期时间内重新 put 值的话,过期时间会清理,重新计算;
3、测试
public class TestMain {
public static void main(String[] args) {
//存入元素
CacheUtils.USER_INFO_MAP.put("00001","zhangsan");
//取出元素
String userName = CacheUtils.USER_INFO_MAP.get("00001");
System.out.println("userName:" + userName);
//查询剩余过期时间
long expectedExpiration = CacheUtils.USER_INFO_MAP.getExpectedExpiration("00001");
System.out.println("剩余过期时间:" + expectedExpiration);
//查看设置的过期时间
long expiration = CacheUtils.USER_INFO_MAP.getExpiration("00001");
System.out.println("设置的过期时间:" + expiration);
}
}
结果打印:
userName:zhangsan
剩余过期时间:43199999
设置的过期时间:43200000