zoukankan      html  css  js  c++  java
  • 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);
    }
    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
  • 相关阅读:
    火狐flash插件
    centos 安装php ide (eclipse + php 插件)
    编译器的工作过程
    php中调用mysql的存储过程和存储函数
    mysql 高性能
    存储过程/游标/mysql 函数
    php 生成二维码
    frameset,frame应用,常用于后台
    html5 meta头部设置
    CAReplicatorLayer复制Layer和动画, 实现神奇的效果
  • 原文地址:https://www.cnblogs.com/hhddd-1024/p/15398367.html
Copyright © 2011-2022 走看看