欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java LocalCache 本地緩存的實現(xiàn)實例

 更新時間:2017年05月08日 15:25:25   作者:特立獨行的豬手  
本篇文章主要介紹了Java LocalCache 本地緩存的實現(xiàn)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

源碼地址: GitHub

使用場景

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

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

實現(xiàn)

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

基于ConcurrentHashMap的實現(xiàn)

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

ConcurrentHashMap作為緩存的存儲結(jié)構(gòu)。因為ConcurrentHashMap的線程安全的,所以基于此實現(xiàn)的LocalCache在多線程并發(fā)環(huán)境的操作是安全的。在JDK1.8中,ConcurrentHashMap是支持完全并發(fā)讀,這對本地緩存的效率也是一種提升。通過調(diào)用ConcurrentHashMapmap的操作來實現(xiàn)對緩存的操作。

私有構(gòu)造函數(shù)

  private LocalCache() {

  }

LocalCache是工具類,通過私有構(gòu)造函數(shù)強化不可實例化的能力。

緩存清除機制

  /**
   * 清除緩存任務(wù)類
   */
  static class CleanWorkerTask extends TimerTask {

    private String key;

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

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

清理失效緩存是由Timer類實現(xiàn)的。內(nèi)部類CleanWorkerTask繼承于TimerTask用戶清除緩存。每當(dāng)新增一個元素的時候,都會調(diào)用timer.schedule加載清除緩存的任務(wù)。

基于LinkedHashMap的實現(xiàn)

LinkedHashMap作為緩存的存儲結(jié)構(gòu)。主要是通過LinkedHashMap的按照訪問順序的特性來實現(xiàn)LRU策略。

LRU

LRULeast Recently Used的縮寫,即最近最久未使用。LRU緩存將會利用這個算法來淘汰緩存中老的數(shù)據(jù)元素,從而優(yōu)化內(nèi)存空間。

基于LRU策略的map

這里利用LinkedHashMap來實現(xiàn)基于LRU策略的map。通過調(diào)用父類LinkedHashMap的構(gòu)造函數(shù)來實例化map。參數(shù)accessOrder設(shè)置為true保證其可以實現(xiàn)LRU策略。

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

    ... // 省略部分代碼

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

    ... // 省略部分代碼

    /**
     * 重寫LinkedHashMap中removeEldestEntry方法;
     * 新增元素的時候,會判斷當(dāng)前map大小是否超過DEFAULT_MAX_CAPACITY,超過則移除map中最老的節(jié)點;
     *
     * @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并不是線程安全,如果不加控制的在多線程環(huán)境下使用的話,會有問題。所以在LRUMap中引入了ReentrantReadWriteLock讀寫鎖,來控制并發(fā)問題。

緩存淘汰機制

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

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

緩存清除機制

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 位運算符>>與>>>區(qū)別案例詳解

    Java 位運算符>>與>>>區(qū)別案例詳解

    這篇文章主要介紹了Java 位運算符>>與>>>區(qū)別案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • HandlerMapping之RequestMappingHandlerMapping作用詳解

    HandlerMapping之RequestMappingHandlerMapping作用詳解

    這篇文章主要介紹了HandlerMapping之RequestMappingHandlerMapping作用詳解,HandlerMapping是用來尋找Handler的,并不與Handler的類型或者實現(xiàn)綁定,而是根據(jù)需要定義的,那么為什么要單獨給@RequestMapping實現(xiàn)一個HandlerMapping,需要的朋友可以參考下
    2023-10-10
  • MyBatis-Plus的物理刪除和邏輯刪除(使用場景)

    MyBatis-Plus的物理刪除和邏輯刪除(使用場景)

    數(shù)據(jù)庫中的數(shù)據(jù)刪除會分為兩種:物理刪除 和 邏輯刪除,接下來通過本文給大家介紹MyBatis-Plus的物理刪除和邏輯刪除使用場景分析,感興趣的朋友一起看看吧
    2021-09-09
  • JAVA內(nèi)存模型(JMM)詳解

    JAVA內(nèi)存模型(JMM)詳解

    這篇文章主要介紹了JAVA內(nèi)存模型(JMM)詳解的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Java使用html2image將html生成縮略圖圖片的實現(xiàn)示例

    Java使用html2image將html生成縮略圖圖片的實現(xiàn)示例

    本文主要介紹了Java使用html2image將html生成縮略圖圖片的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • Java函數(shù)式編程(六):Optional

    Java函數(shù)式編程(六):Optional

    這篇文章主要介紹了Java函數(shù)式編程(六):Optional,本文是系列文章的第6篇,其它文章請參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09
  • 十五道tomcat面試題,為數(shù)不多的機會!

    十五道tomcat面試題,為數(shù)不多的機會!

    這篇文章主要介紹了十五道tomcat面試題,Tomcat的本質(zhì)是一個Servlet容器。一個Servlet能做的事情是:處理請求資源,并為客戶端填充response對象,需要的朋友可以參考下
    2021-08-08
  • 基于maven實現(xiàn)私服搭建步驟圖解

    基于maven實現(xiàn)私服搭建步驟圖解

    這篇文章主要介紹了基于maven實現(xiàn)私服搭建步驟圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • SpringMVC 接收前端傳遞的參數(shù)四種方式小結(jié)

    SpringMVC 接收前端傳遞的參數(shù)四種方式小結(jié)

    這篇文章主要介紹了SpringMVC 接收前端傳遞的參數(shù)四種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中常用數(shù)據(jù)類型的輸入輸出詳解

    Java中常用數(shù)據(jù)類型的輸入輸出詳解

    本文主要介紹了Java中幾個常用的數(shù)據(jù)類型是如何輸入和輸出的,例如:Char型、int型、double型、數(shù)組、字符串等,對我們學(xué)習(xí)java有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2021-12-12

最新評論