重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Java中怎么设置缓存Map过期时间

本篇文章给大家分享的是有关Java中怎么设置缓存Map过期时间,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联专注于企业全网营销推广、网站重做改版、蕲春网站定制设计、自适应品牌网站建设、H5技术购物商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为蕲春等各大城市提供网站开发制作服务。

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 {    ExpiringMap map = 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 ExpiryMap extends 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 m) {    for (Map.Entry 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中怎么设置缓存Map过期时间,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


文章题目:Java中怎么设置缓存Map过期时间
网站路径:http://cqcxhl.cn/article/ggcdii.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP