激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - Java教程 - Java LocalCache 本地緩存的實現實例

Java LocalCache 本地緩存的實現實例

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

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

源碼地址: GitHub

使用場景

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

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

實現

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

基于ConcurrentHashMap的實現

?
1
2
3
4
static {
  timer = new Timer();
  map = new ConcurrentHashMap<>();
}

ConcurrentHashMap作為緩存的存儲結構。因為ConcurrentHashMap的線程安全的,所以基于此實現的LocalCache在多線程并發環境的操作是安全的。在JDK1.8中,ConcurrentHashMap是支持完全并發讀,這對本地緩存的效率也是一種提升。通過調用ConcurrentHashMapmap的操作來實現對緩存的操作。

私有構造函數

?
1
2
3
private LocalCache() {
 
}

LocalCache是工具類,通過私有構造函數強化不可實例化的能力。

緩存清除機制

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 清除緩存任務類
 */
static class CleanWorkerTask extends TimerTask {
 
  private String key;
 
  public CleanWorkerTask(String key) {
    this.key = key;
  }
 
  public void run() {
    LocalCache.remove(key);
  }
}

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

基于LinkedHashMap的實現

LinkedHashMap作為緩存的存儲結構。主要是通過LinkedHashMap的按照訪問順序的特性來實現LRU策略。

LRU

LRULeast Recently Used的縮寫,即最近最久未使用。LRU緩存將會利用這個算法來淘汰緩存中老的數據元素,從而優化內存空間。

基于LRU策略的map

這里利用LinkedHashMap來實現基于LRU策略的map。通過調用父類LinkedHashMap的構造函數來實例化map。參數accessOrder設置為true保證其可以實現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中最老的節點;
     *
     * @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并不是線程安全,如果不加控制的在多線程環境下使用的話,會有問題。所以在LRUMap中引入了ReentrantReadWriteLock讀寫鎖,來控制并發問題。

緩存淘汰機制

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

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

緩存清除機制

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品99一区二区 | 一级在线免费观看视频 | 精品一区二区亚洲 | www.48xx.com| 国产精品国产成人国产三级 | 亚洲网站在线 | 337p粉嫩大胆噜噜噜亚瑟影院 | 一级影片在线观看 | 国产乱一区二区三区视频 | 国产精品久久久久久久久久免 | 久久久久免费电影 | 九草网| 免费黄色大片网站 | 国产日产久久久久久 | 欧洲黄色一级视频 | 91高清免费 | 日韩视频一二三 | 欧美成人精品一区 | 九九视屏 | 狠狠一区二区 | 蜜桃网在线观看 | 51色视频 | 欧美xxxwww | 福利在线影院 | 国产高清毛片 | 国产精品成人一区二区三区电影毛片 | 国产女厕一区二区三区在线视 | 日韩在线欧美在线 | 在线观看免费污视频 | 在线免费91 | 色婷婷一区二区三区 | 免费a级毛片永久免费 | 免费视频一区 | 娇喘视频在线观看 | 色中色在线视频 | 精品一区二区三区毛片 | 91久久久久久久久久久久久 | 91av亚洲| 99精品国产一区二区三区 | 亚洲第一综合色 | 538在线精品|