java map 过期,

  java map 过期,

  一、技术背景。技术效果三。ExpiringMap3.1函数3.2源代码3.3实例四介绍。LoadingCache介绍4.1函数4.2示例4.3移除机制4.4其他五、HashMap的封装

  00-1010在实际项目开发中,我们经常使用缓存中间件(如redis、MemCache等。)来帮助我们提高系统的可用性和健壮性。

  但在很多情况下,如果项目简单,就没有必要引入Redis等中间件来增加系统的复杂度。那么Java本身有没有一个很好用的轻量级缓存组件呢?

  当然,答案是肯定的,而且方法不止一种。常见的解决方案有三种:ExpiringMap、LoadingCache和基于HashMap的封装。

  00-1010实现常用的缓存功能,比如过时删除策略的热数据预热。

  

目录

 

  00-1010可以将Map中的条目设置为一段时间后自动过期。您可以设置地图的最大值。当达到最大值时,再次插入值将导致映射中的第一个值过期。您可以添加一个监听事件,以便在条目过期时安排监听功能。您可以设置延迟加载,以便在调用get()方法时创建对象。

  

一、技术背景

github地址

 

  00-1010添加依赖项(Maven)

  依赖关系groupIdnet.jodah/groupId工件项目映射/工件ID版本0 . 5 . 8/版本/依赖关系示例源代码

  class ExpiringMapApp { public static void main(string[]args){//maxsize :设置最大值。当添加第11个条目时,将导致第1个条目立即过期(甚至在过期时间之前)。//expiration:设置每个键的过期时间为10s。如果密钥没有设置过期时间,则密钥将永远有效。//variableExpiration:允许更新过期时间值。如果未设置variableExpiration,则不允许以后更改过期时间。一旦执行更改过期时间的操作,就会抛出异常:UnsupportedOperationException//policy ://created 3360只清除put和replace方法中的过期时间。//被访问的3360是在已创建的策略基础上添加的,get方法在过期前清除过期时间。//清除到期时间,即重置到期时间,重新计算到期时间。ExpiringMapString,String Map=ExpiringMap。构建器()。MaxSize (10)。到期时间(10,时间单位。秒)。variableExpiration()。expiration policy(expiration policy。已创建)。build();map.put(token , lkj 2412 LJ 1412412 nmlkjl 2n 34 l 23n 4 );Map.put(名称,管理员,20000,时间单位)。秒);//模拟线程等待.试试{ thread . sleep(15000);} catch(interrupted exception e){ e . printstacktrace();} system . out . println( token=== map . get( token ));system . out . println( name=== map . get( name ));//注意:创建映射时,指定的参数,如过期时间和过期策略,是全局的,适用于映射中添加的每个条目。//放入条目键值对时,可以为当前条目单独设置过期时间和过期策略,只对当前条目有效。}}运行结果

  te>token ===> nullname ===> 管理员

  注意在创建map时,指定的那些参数如过期时间和过期策略都是全局的, 对map中添加的每一个entry都适用。在put一个entry键值对时可以对当前entry 单独设置 过期时间、过期策略,只对当前这个entry有效.

  

 

  

四、LoadingCache

 

  

4.1 功能简介

Google开源出来的一个线程安全的本地缓存解决方案。

 

  特点:提供缓存回收机制,监控缓存加载/命中情况,灵活强大的功能,简单易上手的api。

  

 

  

4.2 示例

源码

 

  

public class LoadingCacheApp {    public static void main(String[] args) throws Exception {        // maximumSize: 缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项        // expireAfterAccess: 设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护)        // removalListener: 移除监听器,缓存项被移除时会触发的钩子        // recordStats: 开启Guava Cache的统计功能        LoadingCache<String, String> cache = CacheBuilder.newBuilder()            .maximumSize(100)            .expireAfterAccess(10, TimeUnit.SECONDS)            .removalListener(new RemovalListener<String, String>() {                @Override                public void onRemoval(RemovalNotification<String, String> removalNotification) {                    System.out.println("过时删除的钩子触发了... key ===> " + removalNotification.getKey());                }            })            .recordStats()            .build(new CacheLoader<String, String>() {                // 处理缓存键不存在缓存值时的处理逻辑                @Override                public String load(String key) throws Exception {                    return "不存在的key";                }            });        cache.put("name", "小明");        cache.put("pwd", "112345");        // 模拟线程等待...        try {            Thread.sleep(15000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("token ===> " + cache.get("name"));        System.out.println("name ===> " + cache.get("pwd"));    }}

运行结果

 

  

过时删除的钩子触发了... key ===> nametoken ===> 不存在的key过时删除的钩子触发了... key ===> pwdname ===> 不存在的key

 

  

 

  

4.3 移除机制

guava做cache时候数据的移除分为被动移除和主动移除两种。

 

  被动移除

  基于大小的移除:数量达到指定大小,会把不常用的键值移除基于时间的移除:expireAfterAccess(long, TimeUnit) 根据某个键值对最后一次访问之后多少时间后移除。expireAfterWrite(long, TimeUnit) 根据某个键值对被创建或值被替换后多少时间移除基于引用的移除:主要是基于java的垃圾回收机制,根据键或者值的引用关系决定移除主动移除

  单独移除:Cache.invalidate(key)批量移除:Cache.invalidateAll(keys)移除所有:Cache.invalidateAll()如果配置了移除监听器RemovalListener,则在所有移除的动作时会同步执行该listener下的逻辑。

  如需改成异步,使用:RemovalListeners.asynchronous(RemovalListener, Executor).

  

 

  

4.4 其他

在put操作之前,如果已经有该键值,会先触发removalListener移除监听器,再添加配置了expireAfterAccess和expireAfterWrite,但在指定时间后没有被移除。删除策略逻辑:CacheBuilder构建的缓存不会在特定时间自动执行清理和回收工作,也不会在某个缓存项过期后马上清理,它不会启动一个线程来进行缓存维护,因为首先线程相对较重,其次某些环境限制线程的创建。

 

  它会在写操作时顺带做少量的维护工作,或者偶尔在读操作时做。当然,也可以创建自己的维护线程,以固定的时间间隔调用Cache.cleanUp()。

  

 

  

五、HashMap的封装

我们可以参考上面两个工具包的思路,自己封装一个可以设置过时时间的HashMap来实现我们想要的效果。

 

  到此这篇关于Java如何设置过期时间的map的几种方法的文章就介绍到这了,更多相关Java 过期时间map内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: