最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

使用場(chǎng)景

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

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

實(shí)現(xiàn)

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

基于ConcurrentHashMap的實(shí)現(xiàn)

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

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

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

privateLocalCache(){

}

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

緩存清除機(jī)制

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

   private String key;

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

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

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

基于LinkedHashMap的實(shí)現(xiàn)

LinkedHashMap 作為緩存的存儲(chǔ)結(jié)構(gòu)。主要是通過(guò) LinkedHashMap 的按照訪問(wèn)順序的特性來(lái)實(shí)現(xiàn) LRU 策略。

LRU

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

基于LRU策略的map

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

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

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

    ... // 省略部分代碼
    
    /**
     * 重寫LinkedHashMap中removeEldestEntry方法;
     * 新增元素的時(shí)候,會(huì)判斷當(dāng)前map大小是否超過(guò)DEFAULT_MAX_CAPACITY,超過(guò)則移除map中最老的節(jié)點(diǎn);
     *
     * @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)境下使用的話,會(huì)有問(wèn)題。所以在 LRUMap 中引入了 ReentrantReadWriteLock 讀寫鎖,來(lái)控制并發(fā)問(wèn)題。

緩存淘汰機(jī)制

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

此處重寫 LinkedHashMap removeEldestEntry 方法, 當(dāng)緩存新增元素的時(shí)候,會(huì)判斷當(dāng)前 map 大小是否超過(guò) DEFAULT_MAX_CAPACITY ,超過(guò)則移除map中最老的節(jié)點(diǎn)。

緩存清除機(jī)制

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

源碼地址: GitHub 

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

相關(guān)文章

  • Spring-Security實(shí)現(xiàn)登錄接口流程

    Spring-Security實(shí)現(xiàn)登錄接口流程

    Security?是?Spring?家族中的一個(gè)安全管理框架,SpringSecurity的原理其實(shí)就是一個(gè)過(guò)濾器鏈,內(nèi)部包含了提供各種功能的過(guò)濾器,這篇文章主要介紹了Spring-Security實(shí)現(xiàn)登錄接口,需要的朋友可以參考下
    2023-05-05
  • Java?實(shí)戰(zhàn)項(xiàng)目之家政服務(wù)平臺(tái)系統(tǒng)的實(shí)現(xiàn)流程

    Java?實(shí)戰(zhàn)項(xiàng)目之家政服務(wù)平臺(tái)系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)家政服務(wù)平臺(tái)系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • java中文轉(zhuǎn)拼音工具類詳解

    java中文轉(zhuǎn)拼音工具類詳解

    這篇文章主要為大家詳細(xì)介紹了java中文轉(zhuǎn)拼音工具類的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java設(shè)計(jì)模式之代理模式詳解

    Java設(shè)計(jì)模式之代理模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Spring?Boot?集成接口管理工具?Knife4j

    Spring?Boot?集成接口管理工具?Knife4j

    這篇文章主要介紹了Spring?Boot?集成接口管理工具?Knife4j,首先通過(guò)創(chuàng)建一個(gè)?Spring?Boot?項(xiàng)目展開主題,需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot2.x配置多數(shù)據(jù)源方式

    SpringBoot2.x配置多數(shù)據(jù)源方式

    這篇文章主要介紹了SpringBoot2.x配置多數(shù)據(jù)源方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)庫(kù)連接的教程圖解

    IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)庫(kù)連接的教程圖解

    Properties類是 鍵和值均為字符串的可以永久存儲(chǔ)到文件中的key-value集合。這篇文章主要介紹了IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)路連接 ,需要的朋友可以參考下
    2018-10-10
  • JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí)

    JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí)

    這篇文章主要為大家介紹了JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Spring Aop實(shí)例之AspectJ注解配置

    詳解Spring Aop實(shí)例之AspectJ注解配置

    本篇文章主要介紹了詳解Spring Aop實(shí)例之AspectJ注解配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • java中下拉框select和單選按鈕的回顯操作

    java中下拉框select和單選按鈕的回顯操作

    這篇文章主要介紹了java中下拉框select和單選按鈕的回顯操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10

最新評(píng)論

衡南县| 湖口县| 西乌| 彭泽县| 枣庄市| 自治县| 永登县| 城固县| 泸水县| 阆中市| 滕州市| 六安市| 阜城县| 贞丰县| 德阳市| 通海县| 孝感市| 五原县| 阳朔县| 利川市| 吴江市| 桐梓县| 高碑店市| 张家口市| 岳池县| 宜阳县| 肥西县| 托里县| 天台县| 蓬安县| 香港| 锦屏县| 镶黄旗| 阳谷县| 谢通门县| 海伦市| 临颍县| 永川市| 东乡| 南丹县| 扎鲁特旗|