中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

利用Java如何實現本地緩存

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

本篇文章給大家分享的是有關利用Java如何實現本地緩存,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

使用場景

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

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

實現

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

基于ConcurrentHashMap的實現

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

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

私有構造函數

privateLocalCache(){

}

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

緩存清除機制

/**
 * 清除緩存任務類
 */
 static classCleanWorkerTaskextendsTimerTask{

   private String key;

   publicCleanWorkerTask(String key){
     this.key = key;
   }

   publicvoidrun(){
     LocalCache.remove(key);
   }
 }

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

基于LinkedHashMap的實現

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

LRU

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

基于LRU策略的map

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

static classLRUMap<K,V>extendsLinkedHashMap<K,V>{

    ... // 省略部分代碼
    
    publicLRUMap(intinitialCapacity,floatloadFactor){
      super(initialCapacity, loadFactor, true);
    }

    ... // 省略部分代碼
    
    /**
     * 重寫LinkedHashMap中removeEldestEntry方法;
     * 新增元素的時候,會判斷當前map大小是否超過DEFAULT_MAX_CAPACITY,超過則移除map中最老的節點;
     *
     * @param eldest
     * @return
     */
    protectedbooleanremoveEldestEntry(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 讀寫鎖,來控制并發問題。

緩存淘汰機制

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

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

緩存清除機制

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

以上就是利用Java如何實現本地緩存,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

沙湾县| 云安县| 岗巴县| 阳泉市| 博野县| 改则县| 尉氏县| 铜山县| 那曲县| 定远县| 宣威市| 彭泽县| 大新县| 天津市| 安阳县| 澄迈县| 庄河市| 讷河市| 苏尼特左旗| 资阳市| 易门县| 岳普湖县| 页游| 布尔津县| 务川| 井陉县| 云林县| 克拉玛依市| 哈密市| 抚州市| 桃园县| 乐昌市| 城市| 慈溪市| 普格县| 利津县| 阿勒泰市| 钟祥市| 泾川县| 依兰县| 安福县|