expiringmap入门初体验

2023-10-27

功能简介

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

添加依赖

maven

<dependency> 
<groupId>net.jodah</groupId> 
<artifactId>expiringmap</artifactId> 
<version>0.5.8</version> 
</dependency> 

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

过期策略ExpirationPolicy.CREATED

/**
* 默认5000毫秒失效   时间单位可以自定义 过期策略ExpirationPolicy.CREATED
*/
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"));
    //等待5秒
    Thread.sleep(5001);
    System.out.println(map.get("key"));

执行结果:

key:value
null

过期策略ExpirationPolicy.CREATED

/**
* 更详细的观察
*/
    ExpiringMap<String, String> 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<String, String> 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<String, String> 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<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"));
    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<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("第一个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<String,String> 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<String,String> map = ExpiringMap.builder().
            variableExpiration().
            build();
    ExpirationListener<String,String> 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<String, Connection> 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

expiringmap入门初体验 的相关文章

  • 深度学习框架-TensorFlow

    1 1 TensorFlow介绍 深度学习框架TensorFlow一经发布 就受到了广泛的关注 并在计算机视觉 音频处理 推荐系统和自然语言处理等场景下都被大面积推广使用 现在已发布2 3 0版本 接下来我们深入浅出的介绍Tensorflo
  • R语言:修改chart.Correlation()函数绘制相关性图——完美出图

    最近 需要对一组数据进行相关性分析 之前用R语言画过热图 但感觉还是不够直观 作为一个小白 干什么都不太成体系 所以就直接搜 搜现成的 于是 找到了这个 相关性分析 R语言 相关性矩阵及可视化 相关性分析 R语言 相关性矩阵及可视化 简书
  • JDK8新特性(六):JDK 8 可重复注解 与 类型注解

    前言 自从 Java 5 中引入注解依赖 注解开始变得非常流行 并在各个框架和项目中被广泛使用 不过注解有一个很大的限制 在同一个地方不能多次使用同一个注解 为了解决这个问题 JDK 8 引入了可重复注解的概念 允许在同一个地方多次使用同一
  • MySQL数据库InnoDB存储引擎底层原理详解

    前言 从1996年发布MySQL1 0版本到现在已经历经25年头啦 在这期间不断更新版本 目前最新的版本是8 0 那InnoDB是什么东西 首先它肯定是MySQL的存储引擎并且实现技术相当复杂 如果要描述清楚是怎么实现 可能在烧烤桌上来几打
  • 这十一个副业在家就可以完成,疫情在家也有收入,建议收藏

    2022年 谁还没有副业 经过两年的疫情 我们都知道没有钱是一件非常不舒服的事情 现在的做法是 主营业务要求稳定 副业要求发展 好好发展副业是硬道理 在过去的两年里 我一直在探索副业项目 事实上 有很多人在努力工作 许多项目如雨后春笋般涌现
  • springboot2(黑马程序员)入门

    springboot2课程学习 课程特点 课程内容多 知识点杂乱 课程面向业务需求大 课程定位 小白 完全没有用过springboot技术 目前阶段 初学者 基于springboot进行ssm框架的整合 掌握第三方的技术与springboo
  • Java常量与变量基本数据类型

    1 常量 是指在Java程序中固定不变的数据 也可理解为被 final 修饰的变量 或者是没有被声明为变量的数据 1 1 整数常量 所有的整数 0 1 567 9 1 2 小数常量 所有的小数 0 0 0 1 2 55 1 4 字符常量 单
  • ​深度学习引用数最高的十大论文(附论文下载)

    在过去的几年里 作为机器学习和统计学习的子领域 深度学习已经在诸多领域取得了令人印象深刻的突破 鲁棒性的开源工具 云计算以及大量可用的数据是深度学习能够取得成功的重要基石 下面 我们列出十大深度学习论文 1 Deep Learning by
  • 运放电路采集电流、电压

    当我们利用单片机ADC采样功能 采集电流电压信号时 单片机的IO口输入电压范围是0 3 3V 所以为了保证安全 需要把测量电压保持在这个范围之内 设计目标 采集电流范围 0 1A 采集电压范围 0 15V 实物 基于STM32F103C8T
  • 9. xxl-job原理-- jobthread的作用

    xxl job v2 0 2 原理 目录学习 0 xxl job原理 1 xxl job原理 定时任务架构 2 xxl job原理 调度中心 3 xxl job原理 执行器注册 4 xxl job原理 执行器注册问题 5 xxl job原理
  • 区块链学习笔记1

    1 什么是区块链 区块链是通过去中心 化去信任的方式集体维护一个可靠数据库的技术方案 参与系统中的任意多个节点把系统一段时间内的全部的信息 数据通过密码学算法计算和记录到一个数据块 区块block 并且生成该区块的指纹用于链接下一个区块和校
  • Mybatis框架逆向工程的使用

    文章目录 通过Mybatis框架使用逆向工程 IDEA 1 导入所需Jar包 这里通过Maven方式 不使用Maven也网上下载后导入lib 2 创建逆向工程配置文件generatorConfig xml 3 接下来介绍执行逆向工程gene
  • 自动化特征工程(featuretools)

    一 特征是什么 在机器学习中 特征可以描述为解释现象发生的一组特点 当这些特点转换为一些可测量的形式时 它们就称作特征 二 特征工程 有这么一句话在业界广泛流传 数据和特征决定了机器学习的上限 而模型和算法只是逼近这个上限而已 特征工程可以
  • React 回调函数传默认值和自定义参数

    利用箭头函数 e为默认参数 arg为自定义参数 onTouchStart e gt this touchS e arg
  • SpringBoot用注解实现redis缓存

    1 入口类加注解 EnableCaching EnableRetry 重试 SpringBootApplication MapperScan cn my dao EnableCaching 开启redis缓存 EnableSchedulin
  • Qt之自定义信号

    widget h如下 ifndef WIDGET H define WIDGET H include
  • 认真分析mmap:是什么 为什么 怎么用

    阅读目录 mmap基础概念 mmap内存映射原理 mmap和常规文件操作的区别 mmap优点总结 mmap相关函数 mmap使用细节 回到顶部 mmap基础概念 mmap是一种内存映射文件的方法 即将一个文件或者其它对象映射到进程的地址空间
  • uni-app 支持 app端, h5端,微信小程序端 图片转换文件格式 和 base64

    uni app 支持 app端 h5端 微信小程序端 图片转换文件格式 和 base64 下方是插件市场的地址app端 h5端 微信小程序端 图片转换文件格式 和 base64 DCloud 插件市场 https ext dcloud ne
  • JAVA - 大批量集合数据多线程处理

    原因 最近写项目多时候遇到一个这样的问题 Excel批量导入表格 数据量较大 处理时间较长 然后小编想到了可以用多线程处理 例 导入失败集合 List

随机推荐

  • mysql修改字符集_修改mysql默认字符集的两种方法详细解析

    1 最简单的修改方法 就是修改mysql的my ini文件中的字符集键值 如 default character set utf8 character set server utf8 修改完后 重启mysql的服务 service mysq
  • WARNING: Ignoring invalid distribution

    WARNING Ignoring invalid distribution 目录地址 根据提示到指定目录地址中删除 开头的文件 一般是由于下载过程中异常终止导致的
  • R及R包的安裝、更新及版本查询

    1R包的安裝 1 安裝来自CRAN的R包 install packages openxlsx 2 手动从网上搜索到下载 zip 或 tar gz 文件到本地 再手动安装 download the source file download f
  • c++基础

    1 打印三角形 求和 99乘法表 判断质数 if 0 include
  • 论文精读:Ansor: Generating High-Performance Tensor Programs for Deep Learning

    文章目录 1 Abstract 2 Introduction 3 Background 4 Design Overview 5 Program Sampling 5 1 Sketch Generation 5 2 Random Annota
  • 最近成了三等奖专业户

    最近连续收到三等奖证书若干 最欣慰的是蓝桥杯省赛scratch三等奖 小妞水平也就那样 她从市赛的优秀奖 四等奖 到省赛的三等奖 居然还进步了 老母亲知足了 scratch主要是因为我自己水平有限 没办法高效辅导她 有可能就止步于此 NOC
  • 数据结构期末复习题(线性表 链表)

    目录 线性表 1 用已有数组创建顺序表 2 用键盘输入的方式创建顺序表 3 输出顺序表各元素 4 在顺序表某一个位置插入一个元素 5 在顺序表某一个位置删除一个元素 6 查找顺序表上某个位置的元素并输出 7 查找顺序表上某个数的位置并输出
  • File I/O总结

    一 File类的常用方法 1 boolean exists 判断文件或目录是否存在 2 boolean isFile 判断是否是文件 3boolean isDirectory 判断是否是目录 4 String getPath 返回此对象表示
  • solidity经典案例----拍卖

    Solidity经典合约案例 拍卖 1 案例分析 2 具体的代码 pragma solidity 0 6 1 contract aution demo address payable public seller 卖方 address pay
  • 110道python面试笔试题汇总

    看到一篇python 基础面试练习题文章 有必要面试前做一下 转至 https blog csdn net weixin 40907382 article details 80621513 1 一行代码实现1 100之和 利用sum 函数求
  • Less-7(文件读写操作)

    文章目录 OUTFILE注入 实战 1 关卡分析 2 过关斩将 2 1 secure file priv 2 2 注入过程 load file的使用 SQLmap OUTFILE注入 在前面的学习中 我们知道了sql注入中的盲注和双注入是个
  • CentOS 代理 proxy设置方法

    说明 为什么说是http代理 其实这个还不能说是全称走代理 罪名写的区别就是ICMP协议这个设置就无效 只能说是90 的应用都可以使用这个设置来实现代理访问 只有个别不行 比如一些软件根本不走http协议的 那么此种方法绝对不行 下面是讲解
  • 利用VC++编程实现程序自动启动

    摘要 在工作中经常遇到一些程序 当计算机启动时会自动将该程序加载 以实现对计算机的监控等特殊的目的 本文就针对这个问题 阐述了系统加载特定程序的原理和方法 同时利用VC 6 0编程实现这种特定的功能的 并对其中的关键代码进行了分析 工作中经
  • Peewee进阶

    Part1前言 接上篇文章 如果我们想要修改表结构或者字段属性该如何操作呢 带着这个问题 今天我们就一起来了解 peewee 的进阶操作 Part2关于 playhouse peewee 有很多的扩展 这些扩展都集中收录在 playhous
  • 网线分类解析

    网线的类别分几个维度去看 1 屏蔽双绞线 STP 屏蔽双绞线 是一种特殊的网线 它比非屏蔽双绞线多一道工序 网线内部信号线的外面包裹着一层金属网 在屏蔽层外面才是绝缘外皮 屏蔽层可以有效地隔离外界电磁信号的干扰 这种网线多用于布设网线的环境
  • 三维重建工具——pclpy使用教程

    最近试了试用pclpy这个库进行点云处理 在此对pclpy的使用进行一个总结 更全的pclpy教程 代码完全开源 github 欢迎fork star 相关文章 pclpy安装 文章目录 pclpy相关 开发环境 文件结构 I O读取 构造
  • Git基础操作:push提交多个文件成功后如何撤销回退某个文件,回退代码到某次commit

    之前写过类似的一篇文章 Git基础操作 push提交成功后如何撤销回退 回退代码到某次commit 按照那个示例 把期间所有commitid下的文件都会回滚掉 但是如果只想将其中某个文件回滚可以下面的示例来搞 git log OneBean
  • Broyden算法

    代码传送门 https github com taifyang optimization method Python实现 import sympy import numpy as np from numpy import matlib as
  • java毕业设计——基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏

    基于Java AI的五子棋游戏设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于Java AI的五子棋游戏设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴 可以进入我
  • expiringmap入门初体验

    功能简介 可设置Map中的Entry在一段时间后自动过期 key过期 value同时会过期 可设置Map最大容纳值 当到达Maximum size后 再次插入值会导致Map中的第一个值过期 可添加监听事件 在监听到Entry过期时调度监听函