新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天就跟大家聊聊有关怎么在Java中设置缓存Map过期时间,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联主要从事成都做网站、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务无锡,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
1. ExpiringMap
功能简介 :
1.可设置Map中的Entry在一段时间后自动过期。
2.可设置Map最大容纳值,当到达Maximum size后,再次插入值会导致Map中的第一个值过期。
3.可添加监听事件,在监听到Entry过期时调度监听函数。
4.可以设置懒加载,在调用get()方法时创建对象。
github地址:https://github.com/jhalterman/expiringmap/
maven添加依赖即可使用
net.jodah expiringmap 0.5.8
public static void main(String[] args) throws InterruptedException { ExpiringMapmap = ExpiringMap.builder() .maxSize(100) .expiration(1, TimeUnit.SECONDS) .expirationPolicy(ExpirationPolicy.ACCESSED) .variableExpiration() .build(); map.put("test","test123"); Thread.sleep(500); String test= map.get("test"); System.err.println(test); }
2.Guava - LoadingCache
Google开源出来的一个线程安全的本地缓存解决方案。
特点:提供缓存回收机制,监控缓存加载/命中情况,灵活强大的功能,简单易上手的api
但是该cache不会在特定时间准时回收键值,所以不适用于我当前的业务场景。
com.google.guava guava 27.1-jre
3. ExpiryMap
这是网上某位大佬自己封装的map,继承至HashMap,重写了所有对外的方法,对每个key值都设置了有效期。
我在其基础上增加了使用单例模式获取map。
import java.util.*; /** * @Title: ExpiryMap 可以设置过期时间的Map * @description ExpiryMap继承至HashMap 重写了所有对外的方法,对每个key值都设置了有效期 * @Author: xx * @Version: 1.0 */ public class ExpiryMapextends HashMap { private static final long serialVersionUID = 1L; /** * default expiry time 2s */ private long EXPIRY = 1000 * 2; private HashMap expiryMap = new HashMap<>(); /** 缓存实例对象 */ private volatile static ExpiryMap SameUrlMap; /** * 采用单例模式获取实例 * @return */ public static ExpiryMap getInstance() { //第一次判空,提高效率 if (null == SameUrlMap) { //保证线程安全 synchronized (ExpiryMap.class) { //第二次判空,保证单例对象的唯一性,防止第一次有多个线程进入第一个if判断 if (null == SameUrlMap) { SameUrlMap = new ExpiryMap<>(); } } } return SameUrlMap; } public ExpiryMap(){ super(); } public ExpiryMap(long defaultExpiryTime){ this(1 << 4, defaultExpiryTime); } public ExpiryMap(int initialCapacity, long defaultExpiryTime){ super(initialCapacity); this.EXPIRY = defaultExpiryTime; } @Override public V put(K key, V value) { expiryMap.put(key, System.currentTimeMillis() + EXPIRY); return super.put(key, value); } @Override public boolean containsKey(Object key) { return !checkExpiry(key, true) && super.containsKey(key); } /** * @param key * @param value * @param expiryTime 键值对有效期 毫秒 * @return */ public V put(K key, V value, long expiryTime) { expiryMap.put(key, System.currentTimeMillis() + expiryTime); return super.put(key, value); } @Override public int size() { return entrySet().size(); } @Override public boolean isEmpty() { return entrySet().size() == 0; } @Override public boolean containsValue(Object value) { if (value == null) { return Boolean.FALSE; } Set > set = super.entrySet(); Iterator > iterator = set.iterator(); while (iterator.hasNext()) { java.util.Map.Entry entry = iterator.next(); if(value.equals(entry.getValue())){ if(checkExpiry(entry.getKey(), false)) { iterator.remove(); return Boolean.FALSE; }else { return Boolean.TRUE; } } } return Boolean.FALSE; } @Override public Collection values() { Collection values = super.values(); if(values == null || values.size() < 1) { return values; } Iterator iterator = values.iterator(); while (iterator.hasNext()) { V next = iterator.next(); if(!containsValue(next)) { iterator.remove(); } } return values; } @Override public V get(Object key) { if (key == null) { return null; } if(checkExpiry(key, true)) { return null; } return super.get(key); } /** * * @Description: 是否过期 * @param key * @return null:不存在或key为null -1:过期 存在且没过期返回value 因为过期的不是实时删除,所以稍微有点作用 */ public Object isInvalid(Object key) { if (key == null) { return null; } if(!expiryMap.containsKey(key)){ return null; } long expiryTime = expiryMap.get(key); boolean flag = System.currentTimeMillis() > expiryTime; if(flag){ super.remove(key); expiryMap.remove(key); return -1; } return super.get(key); } @Override public void putAll(Map extends K, ? extends V> m) { for (Map.Entry extends K, ? extends V> e : m.entrySet()) { expiryMap.put(e.getKey(), System.currentTimeMillis() + EXPIRY); } super.putAll(m); } @Override public Set > entrySet() { Set > set = super.entrySet(); Iterator > iterator = set.iterator(); while (iterator.hasNext()) { java.util.Map.Entry entry = iterator.next(); if(checkExpiry(entry.getKey(), false)) { iterator.remove(); } } return set; } /** * * @Description: 是否过期 * @param expiryTime true 过期 * @param isRemoveSuper true super删除 * @return */ private boolean checkExpiry(Object key, boolean isRemoveSuper){ if(!expiryMap.containsKey(key)){ return Boolean.FALSE; } long expiryTime = expiryMap.get(key); boolean flag = System.currentTimeMillis() > expiryTime; if(flag){ if(isRemoveSuper) { super.remove(key); } expiryMap.remove(key); } return flag; } public static void main(String[] args) throws InterruptedException { ExpiryMap map = new ExpiryMap<>(); map.put("test", "xxx"); map.put("test2", "ankang", 5000); System.out.println("test==" + map.get("test")); Thread.sleep(3000); System.out.println("test==" + map.get("test")); System.out.println("test2==" + map.get("test2")); Thread.sleep(3000); System.out.println("test2==" + map.get("test2")); } }
Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有序,可重复的;3、Set集合:不可重复;4、Map映射:无序,键唯一,值不唯一。
看完上述内容,你们对怎么在Java中设置缓存Map过期时间有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。