ExpiringMap用法详解

1、功能简介

  1. 可设置Map中的Entry在一段时间后自动过期。
  2. 可设置Map最大容纳值,当到达Maximum size后,再次插入值会导致Map中的第一个值过期。
  3. 可添加监听事件,在监听到Entry过期时调度监听函数。
  4. 可以设置懒加载,在调用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);
}
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
原文地址:https://www.cnblogs.com/hhddd-1024/p/15398367.html