expiringmap入门初体验

功能简介

  • 可设置Map中的Entry在一段时间后自动过期,key过期 value同时会过期。
  • 可设置Map最大容纳值,当到达Maximum size后,再次插入值会导致Map中的第一个值过期。
  • 可添加监听事件,在监听到Entry过期时调度监听函数。
  • 可以设置懒加载,在调用get()方法时创建对象。
  • 可以设置过期策略:
    • ExpirationPolicy.CREATED:在每次更新元素时,过期时间同时清零。
    • ExpirationPolicy.ACCESSED:在每次访问元素时,过期时间同时清零. 暂时未用到

添加依赖

maven

 
net.jodah 
expiringmap 
0.5.8 
 

gradle
compile group: 'net.jodah', name: 'expiringmap', version: '0.5.8'

过期策略ExpirationPolicy.CREATED

/**
* 默认5000毫秒失效   时间单位可以自定义 过期策略ExpirationPolicy.CREATED
*/
ExpiringMapmap=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 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 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 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 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 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 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 map = ExpiringMap.builder().
            variableExpiration().
            build();
    ExpirationListener 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 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

你可能感兴趣的:(expiringmap入门初体验)