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

溫馨提示×

溫馨提示×

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

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

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

邵阳县| 清水河县| 吐鲁番市| 咸宁市| 西吉县| 阆中市| 呼和浩特市| 廊坊市| 聊城市| 拉萨市| 镇宁| 嵩明县| 鄂温| 襄垣县| 陈巴尔虎旗| 和平县| 色达县| 玉屏| 青海省| 读书| 雷波县| 云阳县| 张家港市| 阜新市| 黄山市| 民和| 诏安县| 永新县| 沽源县| 文登市| 洮南市| 芜湖市| 赤水市| 天祝| 伽师县| 临朐县| 伊金霍洛旗| 襄城县| 渭南市| 福安市| 阳江市|