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

Java本地緩存的實現(xiàn)代碼

 更新時間:2017年05月06日 09:03:33   作者:Lis`s Blog  
本篇文章主要介紹了Java本地緩存的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

使用場景

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

在集群環(huán)境下,常用的分布式緩存有 Redis 、 Memcached 等。但在某些業(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)用 ConcurrentHashMap map 的操作來實現(xiàn)對緩存的操作。

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

privateLocalCache(){

}

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

緩存清除機制

/**
 * 清除緩存任務(wù)類
 */
 static classCleanWorkerTaskextendsTimerTask{

   private String key;

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

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

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

基于LinkedHashMap的實現(xiàn)

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

LRU

LRU Least 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 classLRUMap<K,V>extendsLinkedHashMap<K,V>{

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

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

緩存淘汰機制

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

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

緩存清除機制

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

源碼地址: GitHub 

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

相關(guān)文章

  • idea編譯時不提示任何錯誤信息的問題及解決

    idea編譯時不提示任何錯誤信息的問題及解決

    這篇文章主要介紹了idea編譯時不提示任何錯誤信息的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java排序算法之直接插入、快排和希爾排序詳解

    Java排序算法之直接插入、快排和希爾排序詳解

    這篇文章主要給大家介紹了Java排序算法中的直接插入、快排和希爾排序,文中有詳細的圖文解釋和代碼示例,對我們學(xué)習Java算法有一定的幫助,感興趣的同學(xué)可以參考閱讀下
    2023-07-07
  • 基于hibernate框架在eclipse下的配置方法(必看篇)

    基于hibernate框架在eclipse下的配置方法(必看篇)

    下面小編就為大家?guī)硪黄趆ibernate框架在eclipse下的配置方法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • springboot使用Hutool的JschUtil及下載安裝步驟

    springboot使用Hutool的JschUtil及下載安裝步驟

    這篇文章主要為大家介紹了springboot使用Hutool的JschUtil的方法及下載安裝詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 簡單分析Java線程編程中ThreadLocal類的使用

    簡單分析Java線程編程中ThreadLocal類的使用

    這篇文章主要介紹了Java線程編程中ThreadLocal類的使用,包括使用其對共享變量的操作的分析,需要的朋友可以參考下
    2015-12-12
  • Java反射技術(shù)詳解及實例解析

    Java反射技術(shù)詳解及實例解析

    這篇文章主要介紹了Java反射技術(shù)詳解及實例解析,反射可以說是Java中最強大的技術(shù)了,它可以做的事情太多太多,很多優(yōu)秀的開源框架都是通過反射完成的。如果對JAVA感興趣來可以學(xué)習一下
    2020-07-07
  • Java BeanUtils工具類常用方法講解

    Java BeanUtils工具類常用方法講解

    這篇文章主要介紹了Java BeanUtils工具類常用方法講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 5個并發(fā)處理技巧代碼示例

    5個并發(fā)處理技巧代碼示例

    這篇文章主要介紹了5個并發(fā)處理技巧代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • spring?MVC實現(xiàn)簡單登錄功能

    spring?MVC實現(xiàn)簡單登錄功能

    這篇文章主要為大家詳細介紹了spring?MVC實現(xiàn)簡單登錄功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • java爬取豆瓣電影示例解析

    java爬取豆瓣電影示例解析

    這篇文章主要介紹了java爬取豆瓣電影示例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-07-07

最新評論