ExpiringMap,一个可以用于缓存的 Map
1.1 简介
1.1.1 概述
ExpiringMap 是一个高性能,低开销,零依赖,由线程安全的 ConcurrentMap 实现可以设置过期时间的 Map。功能包括:可设置 Map 中的 Entry 在一段时间后自动过期。可设置 Map 最大容纳值,当到达 Maximum size 后,再次插入值会导致 Map 中的第一个值过期。可添加监听事件,在监听到 Entry 过期时调度监听函数。可以设置懒加载,在调用 get() 方法时创建对象。☛ 项目地址
1.1.2 常用 API
♞ enum ExpirationPolicy
:枚举,确定 ExpiringMap 元素应如何过期,ACCESSED
根据上次访问的时间使它们过期,即从上次访问后开始计时;CREATED
根据条目的创建时间使它们过期,即从创建之后开始计时。
♞ enum TimeUnit
:枚举,确定时间单位,MILLISECONDS
时间单位毫秒,SECONDS
时间单位秒,MINUTES
时间单位分钟,HOURS
时间单位小时,DAYS
时间单位天
♞ interface EntryLoader<K, V>
:按需加载,内有 V load(K key)
方法,调用时将 key 的新值加载到即将过期的映射中。
♞ interface ExpiringEntryLoader<K, V>
:按需加载,并控制每个值的过期时间(即可变过期时间),内有 ExpiringValue<V> load(K key)
方法,调用时将 key 的新值加载到即将过期的映射中。
♞ static final class Builder<K, V>
:内部类,ExpiringMap 构造器。 默认为 ExpirationPolicy.CREATED,60 个 TimeUnit.SECONDS 到期和 Integer.MAX_VALUE 的 MAXSIZE。
♞ static Builder<Object, Object> builder()
:创建一个 ExpiringMap 构造器,返回 ExpiringMap.Builder。
♞ Builder<K, V> expiration(long duration, TimeUnit timeUnit)
:构造器中的方法,用于设置 Map 的过期时间,返回 ExpiringMap.Builder。
♞ Builder<K, V> maxSize(int maxSize)
:设置 Map 的最大个数,超过限制仍要添加元素时将最先过期的元素过期。
♞ int getMaxSize()
:获取 Map 的最大个数。
♞ Builder<K1, V1> entryLoader(EntryLoader<? super K1, ? super V1> loader)
:构造器中的方法,可以设置 EntryLoader,EntryLoader 和 ExpiringEntryLoader,不能同时设置。
♞ Builder<K1, V1> expiringEntryLoader(ExpiringEntryLoader<? super K1, ? super V1> loader)
:构造器中的方法,可以设置 ExpiringEntryLoader,EntryLoader 和 ExpiringEntryLoader,不能同时设置。
♞ Builder<K, V> expirationPolicy(ExpirationPolicy expirationPolicy)
:构造器中的方法,用于设置 Map 的过期策略,返回 ExpiringMap.Builder。
♞ Builder<K, V> variableExpiration()
:构造器中的方法,允许 Map 元素具有各自的到期时间,并允许更改到期时间。
♞ Builder<K1, V1> expirationListener(ExpirationListener<? super K1, ? super V1> listener)
:构造器中的方法,配置监听每个 Map 元素过期, 通知传入的 ExpirationListener 执行预定好的操作。
♞ void addExpirationListener(ExpirationListener<K, V> listener)
:给 ExpiringMap 添加过期监听器。
♞ void removeExpirationListener(ExpirationListener<K, V> listener)
:移出 ExpiringMap 的过期监听。
♞ long getExpiration(K key)
:获取指定 key 对应的元素的过期时间,返回毫秒值。
♞ long getExpectedExpiration(K key)
:获取指定 key 预计到期时间,返货毫秒值。
♞ ExpirationPolicy getExpirationPolicy(K key)
:获取指定 key 对应的元素的过期策略。
♞ interface ExpirationListener<K, V>
:过期监听接口,有一个 void expired(K key, V value)
方法,过期时自动调用。
♞ ExpiringMap<K1, V1> build()
:创建并返回一个 ExpiringMap。
1.1.3 Maven 依赖
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.8</version>
</dependency>
1.2 示例
1.2.1 设置过期时间与过期协议
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/6
* @description 构建时设置过期时间与过期策略
*/
public class MyTest {
ExpiringMap<String, String> ACCESSED = ExpiringMap.builder().expiration(10, TimeUnit.SECONDS)
.expirationPolicy(ExpirationPolicy.ACCESSED)
.build();
ExpiringMap<String, String> CREATED = ExpiringMap.builder().expiration(10, TimeUnit.SECONDS)
.expirationPolicy(ExpirationPolicy.CREATED)
.build();
@Test
public void testA() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ACCESSED.put("name", "小张");
CREATED.put("name", "小李");
System.out.println(sdf.format(new Date()));
System.out.println("ACCESSED name 还有 " + ACCESSED.getExpectedExpiration("name")
+ " ms过期, name = " + ACCESSED.get("name"));
System.out.println("CREATED name 还有 " + CREATED.getExpectedExpiration("name")
+ " ms过期, name = " + CREATED.get("name"));
Thread.sleep(6000);
System.out.println(sdf.format(new Date()));
System.out.println("ACCESSED name 还有 " + ACCESSED.getExpectedExpiration("name")
+ " ms过期, name = " + ACCESSED.get("name"));
System.out.println("CREATED name 还有 " + CREATED.getExpectedExpiration("name")
+ " ms过期, name = " + CREATED.get("name"));
Thread.sleep(5000);
System.out.println(sdf.format(new Date()));
System.out.println("ACCESSED name 还有 " + ACCESSED.getExpectedExpiration("name")
+ " ms过期, name = " + ACCESSED.get("name"));
System.out.println("CREATED name 已过期, name = " + CREATED.get("name"));
Thread.sleep(11000);
System.out.println(sdf.format(new Date()));
System.out.println("ACCESSED name 已过期, name = " + ACCESSED.get("name"));
System.out.println("CREATED name 已过期, name = " + CREATED.get("name"));
}
}
1.2.2 单个元素设置过期时间
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/6
* @description 构建后给单个元素设置过期时间
*/
public class MyTest {
ExpiringMap<String, String> map = ExpiringMap.builder().variableExpiration().build();
@Test
public void testA() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
map.put("name", "小张", ExpirationPolicy.CREATED, 5000, TimeUnit.MILLISECONDS);
System.out.println(sdf.format(new Date()));
System.out.println("还有" + map.getExpectedExpiration("name") + " ms过期 ,name=" + map.get("name"));
Thread.sleep(5001);
System.out.println(sdf.format(new Date()));
System.out.println( "已过期 ,name=" + map.get("name"));
}
}
1.2.3 设置过期监听
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/6
* @description 构建时设置过期监听
*/
public class MyTest {
ExpiringMap<String, String> map = ExpiringMap.builder().variableExpiration()
.expirationListener((thekey, thevalue) -> {
System.out.println("key: " + thekey + " -- value: " + thevalue + " 过期");
}).build();
@Test
public void testA() throws InterruptedException {
map.put("name", "小张", ExpirationPolicy.CREATED, 5000, TimeUnit.MILLISECONDS);
Thread.sleep(5001);
System.out.println( "已过期 ,name=" + map.get("name"));
}
}
1.2.4 添加过期监听
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/6
* @description 构建后添加过期监听
*/
public class MyTest {
ExpiringMap<String, String> map = ExpiringMap.builder().variableExpiration().build();
// 可用 Lambda 表达式 (key, value) -> System.out.println()
ExpirationListener<String, String> expirationListener = new ExpirationListener<String, String>() {
@Override
public void expired(String key, String value) {
System.out.println("key: " + key + " -- value: " + value + " 过期");
}
};
@Test
public void testA() throws InterruptedException {
map.put("name", "小张", ExpirationPolicy.CREATED, 5000, TimeUnit.MILLISECONDS);
map.addExpirationListener(expirationListener);
Thread.sleep(5001);
System.out.println( "已过期 ,name=" + map.get("name"));
}
}
1.2.5 懒加载
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/8/6
* @description 懒加载
*/
public class MyTest {
ExpiringMap<String, Student> map = ExpiringMap.builder().expiration(5000, TimeUnit.MILLISECONDS)
.entryLoader(key -> new Student()).build();
ExpirationListener<String, Student> expirationListener = new ExpirationListener<String, Student>() {
@Override
public void expired(String key, Student value) {
System.out.println("key: " + key + " -- value: " + value + " 过期");
}
};
@Test
public void testA() throws InterruptedException {
map.addExpirationListener(expirationListener);
// 使用懒加载时,可以不用去 put 对象,在调用 get 方法时会自动创建对象
Student student = map.get("student");
student.setName("张三");
student.setAge(23);
System.out.println(map.get("student"));
Thread.sleep(5001);
}
}
class Student {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
- 树莓派:设置与软件安装
- spring-boot 速成(11) - 单元测试
- OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
- 2018年智能家居行业趋势 写在2017年关键词里
- 树莓派与arduino通信
- process information unavailable 的解决办法
- JS魔法堂:再识IE的内存泄露
- 给树莓派安装中文字库
- Hadoop(十七)之MapReduce作业配置与Mapper和Reducer类
- Design Pattern: Observer Pattern
- Hadoop(十六)之使用Combiner优化MapReduce
- ActiveMQ笔记(6):消息延时投递
- CentOS 安装 Maven
- Architecture Pattern: Publish-subscribe Pattern
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法