亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么設置緩存Map過期時間

發布時間:2021-07-27 14:26:04 來源:億速云 閱讀:498 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關Java中怎么設置緩存Map過期時間,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1. ExpiringMap

功能簡介 :

1.可設置Map中的Entry在一段時間后自動過期。

2.可設置Map最大容納值,當到達Maximum size后,再次插入值會導致Map中的第一個值過期。

3.可添加監聽事件,在監聽到Entry過期時調度監聽函數。

4.可以設置懶加載,在調用get()方法時創建對象。

github地址:https://github.com/jhalterman/expiringmap/

maven添加依賴即可使用

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

public static void main(String[] args) throws InterruptedException {    ExpiringMap<String,String> 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不會在特定時間準時回收鍵值,所以不適用于我當前的業務場景。

<dependency>  <groupId>com.google.guava</groupId>  <artifactId>guava</artifactId>  <version>27.1-jre</version></dependency>

3. ExpiryMap

這是網上某位大佬自己封裝的map,繼承至HashMap,重寫了所有對外的方法,對每個key值都設置了有效期。

我在其基礎上增加了使用單例模式獲取map。

import java.util.*;/** * @Title: ExpiryMap 可以設置過期時間的Map * @description ExpiryMap繼承至HashMap 重寫了所有對外的方法,對每個key值都設置了有效期 * @Author: xx * @Version: 1.0 */public class ExpiryMap<K, V> extends HashMap<K, V> {  private static final long serialVersionUID = 1L;  /**   * default expiry time 2s   */  private long EXPIRY = 1000 * 2;  private HashMap<K, Long> expiryMap = new HashMap<>();  /** 緩存實例對象 */  private volatile static ExpiryMap<String, String> 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<Entry<K, V>> set = super.entrySet();    Iterator<Entry<K, V>> iterator = set.iterator();    while (iterator.hasNext()) {      java.util.Map.Entry<K, V> 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<V> values() {    Collection<V> values = super.values();    if(values == null || values.size() < 1) {      return values;    }    Iterator<V> 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<Map.Entry<K,V>> entrySet() {    Set<java.util.Map.Entry<K, V>> set = super.entrySet();    Iterator<java.util.Map.Entry<K, V>> iterator = set.iterator();    while (iterator.hasNext()) {      java.util.Map.Entry<K, V> 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<String, String> 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過期時間,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德阳市| 庐江县| 青海省| 清河县| 鲁山县| 盘山县| 中宁县| 南雄市| 洪泽县| 乌苏市| 沅江市| 宁河县| 剑川县| 东丰县| 安仁县| 闻喜县| 湛江市| 张家川| 咸阳市| 如皋市| 旺苍县| 梓潼县| 双城市| 南宁市| 海林市| 广平县| 会宁县| 都匀市| 上林县| 剑河县| 新兴县| 大厂| 栾川县| 普兰店市| 江孜县| 溆浦县| 芦溪县| 丰宁| 神池县| 雅安市| 五河县|