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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。