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

溫馨提示×

溫馨提示×

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

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

利用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

略阳县| 兴山县| 新闻| 新巴尔虎右旗| 保靖县| 亳州市| 芮城县| 留坝县| 仁怀市| 徐水县| 思南县| 肇源县| 梁平县| 富蕴县| 方正县| 织金县| 乌鲁木齐县| 巩义市| 四会市| 福海县| 泾川县| 乌兰察布市| 崇左市| 毕节市| 孟州市| 和平县| 蚌埠市| 北宁市| 河东区| 通道| 百色市| 涪陵区| 荆门市| 苏尼特左旗| 方正县| 临泽县| 扎囊县| 太湖县| 永寿县| 江都市| 五家渠市|