91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

在Java中使用 LocalCache如何實現本地緩存

發布時間:2020-11-18 16:44:28 來源:億速云 閱讀:286 作者:Leah 欄目:編程語言

在Java中使用 LocalCache如何實現本地緩存?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

使用場景

在Java應用中,對于訪問頻率高,更新少的數據,通常的方案是將這類數據加入緩存中。相對從數據庫中讀取來說,讀緩存效率會有很大提升。

在集群環境下,常用的分布式緩存有RedisMemcached等。但在某些業務場景上,可能不需要去搭建一套復雜的分布式緩存系統,在單機環境下,通常是會希望使用內部的緩存(LocalCache)。

實現

這里提供了兩種LocalCache的實現,一種是基于ConcurrentHashMap實現基本本地緩存,另外一種是基于LinkedHashMap實現LRU策略的本地緩存。

基于ConcurrentHashMap的實現

  static {
    timer = new Timer();
    map = new ConcurrentHashMap<>();
  }

ConcurrentHashMap作為緩存的存儲結構。因為ConcurrentHashMap的線程安全的,所以基于此實現的LocalCache在多線程并發環境的操作是安全的。在JDK1.8中,ConcurrentHashMap是支持完全并發讀,這對本地緩存的效率也是一種提升。通過調用ConcurrentHashMapmap的操作來實現對緩存的操作。

私有構造函數

  private LocalCache() {

  }

LocalCache是工具類,通過私有構造函數強化不可實例化的能力。

緩存清除機制

  /**
   * 清除緩存任務類
   */
  static class CleanWorkerTask extends TimerTask {

    private String key;

    public CleanWorkerTask(String key) {
      this.key = key;
    }

    public void run() {
      LocalCache.remove(key);
    }
  }

清理失效緩存是由Timer類實現的。內部類CleanWorkerTask繼承于TimerTask用戶清除緩存。每當新增一個元素的時候,都會調用timer.schedule加載清除緩存的任務。

基于LinkedHashMap的實現

LinkedHashMap作為緩存的存儲結構。主要是通過LinkedHashMap的按照訪問順序的特性來實現LRU策略。

LRU

LRULeast Recently Used的縮寫,即最近最久未使用。LRU緩存將會利用這個算法來淘汰緩存中老的數據元素,從而優化內存空間。

基于LRU策略的map

這里利用LinkedHashMap來實現基于LRU策略的map。通過調用父類LinkedHashMap的構造函數來實例化map。參數accessOrder設置為true保證其可以實現LRU策略。

static class LRUMap<K, V> extends LinkedHashMap<K, V> {

    ... // 省略部分代碼

    public LRUMap(int initialCapacity, float loadFactor) {
      super(initialCapacity, loadFactor, true);
    }

    ... // 省略部分代碼

    /**
     * 重寫LinkedHashMap中removeEldestEntry方法;
     * 新增元素的時候,會判斷當前map大小是否超過DEFAULT_MAX_CAPACITY,超過則移除map中最老的節點;
     *
     * @param eldest
     * @return
     */
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
      return size() > DEFAULT_MAX_CAPACITY;
    }

  }

線程安全

 /**
     * 讀寫鎖
     */
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    private final Lock rLock = readWriteLock.readLock();

    private final Lock wLock = readWriteLock.writeLock();

LinkedHashMap并不是線程安全,如果不加控制的在多線程環境下使用的話,會有問題。所以在LRUMap中引入了ReentrantReadWriteLock讀寫鎖,來控制并發問題。

緩存淘汰機制

 protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
      return size() > DEFAULT_MAX_CAPACITY;
    }

此處重寫LinkedHashMapremoveEldestEntry方法, 當緩存新增元素的時候,會判斷當前map大小是否超過DEFAULT_MAX_CAPACITY,超過則移除map中最老的節點。

緩存清除機制

緩存清除機制與ConcurrentHashMap的實現一致,均是通過timer實現。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

前郭尔| 板桥市| 遂溪县| 呼和浩特市| 师宗县| 呼伦贝尔市| 乌海市| 洮南市| 凤庆县| 南宁市| 江陵县| 云和县| 赤峰市| 伊川县| 北宁市| 磴口县| 醴陵市| 怀来县| 东方市| 南和县| 嵊州市| 岳池县| 嘉义县| 乌审旗| 大洼县| 乌兰浩特市| 河池市| 禹城市| 兴义市| 堆龙德庆县| 巴林左旗| 石嘴山市| 阿巴嘎旗| 灵寿县| 商都县| 衡水市| 延长县| 方城县| 昔阳县| 桃园县| 沈丘县|