一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java LocalCache 本地緩存的實現(xiàn)實例

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

2020-09-27 15:36特立獨行的豬手 Java教程

本篇文章主要介紹了Java LocalCache 本地緩存的實現(xiàn)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

源碼地址: GitHub

使用場景

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

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

實現(xiàn)

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

基于ConcurrentHashMap的實現(xiàn)

?
1
2
3
4
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ù)

?
1
2
3
private LocalCache() {
 
}

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

緩存清除機制

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 清除緩存任務(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用戶清除緩存。每當新增一個元素的時候,都會調(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策略。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static class LRUMap<K, V> extends LinkedHashMap<K, V> {
 
    ... // 省略部分代碼
 
    public LRUMap(int initialCapacity, float loadFactor) {
      super(initialCapacity, loadFactor, true);
    }
 
    ... // 省略部分代碼
 
    /**
     * 重寫LinkedHashMap中removeEldestEntry方法;
     * 新增元素的時候,會判斷當前map大小是否超過DEFAULT_MAX_CAPACITY,超過則移除map中最老的節(jié)點;
     *
     * @param eldest
     * @return
     */
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
      return size() > DEFAULT_MAX_CAPACITY;
    }
 
  }

線程安全

?
1
2
3
4
5
6
7
8
/**
    * 讀寫鎖
    */
   private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
 
   private final Lock rLock = readWriteLock.readLock();
 
   private final Lock wLock = readWriteLock.writeLock();

LinkedHashMap并不是線程安全,如果不加控制的在多線程環(huán)境下使用的話,會有問題。所以在LRUMap中引入了ReentrantReadWriteLock讀寫鎖,來控制并發(fā)問題。

緩存淘汰機制

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

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

緩存清除機制

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

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

原文鏈接:http://www.jianshu.com/p/4194483127fe#

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费观看视频网站 | 国产一区二区免费在线 | 日本动漫啪啪动画片mv | 我和么公的秘密小说免费 | 日本红色高清免费观看 | 日韩欧美精品一区二区 | 欧美xxoo黑人又粗暴 | 小鸟酱在线播放 | 成年人在线视频免费观看 | 好大用力深一点 | chinesemature老女人 | 国产精品久久久久影视不卡 | 95在线观看精品视频 | 9久re在线观看视频精品 | 亚洲欧美日韩成人一区在线 | 欧美日韩综合网在线观看 | 日韩欧一级毛片在线播无遮挡 | 91精品国产综合久久 | 青青国产成人久久激情911 | 嫩草蜜桃 | 精品卡1卡2卡三卡免费网站 | 国产亚洲欧美一区二区三区 | 韩国情事伦理片观看地址 | 亚洲日本在线观看网址 | 99久久精品自在自看国产 | 免费在线观看中文字幕 | yy111111影院理论大片 | 极品美女写真菠萝蜜视频 | 成人资源影音先锋久久资源网 | 亚洲国产综合久久久无码色伦 | 九九久久国产精品免费热6 九九精品视频一区二区三区 | 男人把大ji巴放进男人免费视频 | 日本加勒比在线精品视频 | 黄色大片免费网站 | 色先锋影音先锋 | 日本免费高清在线观看播放 | 精品国产美女福利在线 | 99热这里只有精品一区二区三区 | 国产成人久久精品区一区二区 | 女人张开腿让男人做爽爽 | 亚洲欧美成人综合久久久 |