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

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

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

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

Java本地緩存的實現代碼

2020-09-25 13:47Lis`s Blog Java教程

本篇文章主要介紹了Java本地緩存的實現代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

使用場景

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

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

實現

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

基于ConcurrentHashMap的實現

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

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

私有構造函數

?
1
2
3
privateLocalCache(){
 
}

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

緩存清除機制

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 清除緩存任務類
 */
 static classCleanWorkerTaskextendsTimerTask{
 
   private String key;
 
   publicCleanWorkerTask(String key){
     this.key = key;
   }
 
   publicvoidrun(){
     LocalCache.remove(key);
   }
 }

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

基于LinkedHashMap的實現

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

LRU

LRU Least 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 classLRUMap<K,V>extendsLinkedHashMap<K,V>{
 
    ... // 省略部分代碼
    
    publicLRUMap(intinitialCapacity,floatloadFactor){
      super(initialCapacity, loadFactor, true);
    }
 
    ... // 省略部分代碼
    
    /**
     * 重寫LinkedHashMap中removeEldestEntry方法;
     * 新增元素的時候,會判斷當前map大小是否超過DEFAULT_MAX_CAPACITY,超過則移除map中最老的節點;
     *
     * @param eldest
     * @return
     */
    protectedbooleanremoveEldestEntry(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
protectedbooleanremoveEldestEntry(Map.Entry<K, V> eldest){
  return size() > DEFAULT_MAX_CAPACITY;
}

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

緩存清除機制

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

源碼地址: GitHub

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

原文鏈接:http://lishuo.me/2017/05/05/Java%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98%E7%9A%84%E5%AE%9E%E7%8E%B0/?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日日噜噜噜噜久久久精品毛片 | 久久人人人 | 国产一区二区在线免费 | 亚洲精品自在在线观看 | 成人黄色小视频网站 | 精品亚洲一区二区三区 | 久久久国产精品网站 | 国产成人精品一区在线播放 | 久久精品无码一区二区三区 | 欧美一级高清免费 | 久久久裸体视频 | 99精品在线视频观看 | av国语 | 国产欧美亚洲精品a | 免费色片 | www.99热视频 | 国产无遮挡一级毛片 | 视频在线91 | 久久网站热最新地址 | av不卡免费观看 | 青热久思思 | 视频一区二区久久 | 国产 视频 一区二区 | 国产资源在线视频 | 激情小说激情电影 | 国产a级片电影 | 亚洲免费永久 | 精品一区二区三区在线观看国产 | av电影免费在线 | 26uuu成人人网图片 | 在线亚洲免费视频 | 亚洲尻逼视频 | 久久精品亚洲精品国产欧美kt∨ | 在线成人av观看 | 99精品欧美一区二区 | 日本黄色一级视频 | 日本免费一区二区三区四区 | 成人超碰 | 日本羞羞影院 | 韩日黄色片 | 久久色亚洲 |