您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關利用Java如何實現本地緩存,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
使用場景
在 Java
應用中,對于訪問頻率高,更新少的數據,通常的方案是將這類數據加入緩存中。相對從數據庫中讀取來說,讀緩存效率會有很大提升。
在集群環境下,常用的分布式緩存有 Redis 、 Memcached 等。但在某些業務場景上,可能不需要去搭建一套復雜的分布式緩存系統,在單機環境下,通常是會希望使用內部的緩存( LocalCache )。
實現
這里提供了兩種 LocalCache
的實現,一種是基于 ConcurrentHashMap
實現基本本地緩存,另外一種是基于 LinkedHashMap
實現 LRU
策略的本地緩存。
基于ConcurrentHashMap的實現
static { timer = new Timer(); map = new ConcurrentHashMap<>(); }
以 ConcurrentHashMap
作為緩存的存儲結構。因為 ConcurrentHashMap
的線程安全的,所以基于此實現的 LocalCache
在多線程并發環境的操作是安全的。在 JDK1.8
中, ConcurrentHashMap
是支持完全并發讀,這對本地緩存的效率也是一種提升。通過調用 ConcurrentHashMap
對 map
的操作來實現對緩存的操作。
私有構造函數
privateLocalCache(){ }
LocalCache
是工具類,通過私有構造函數強化不可實例化的能力。
緩存清除機制
/** * 清除緩存任務類 */ 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
策略。
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; } }
線程安全
/** * 讀寫鎖 */ private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private final Lock rLock = readWriteLock.readLock(); private final Lock wLock = readWriteLock.writeLock();
LinkedHashMap
并不是線程安全,如果不加控制的在多線程環境下使用的話,會有問題。所以在 LRUMap
中引入了 ReentrantReadWriteLock
讀寫鎖,來控制并發問題。
緩存淘汰機制
protectedbooleanremoveEldestEntry(Map.Entry<K, V> eldest){ return size() > DEFAULT_MAX_CAPACITY; }
此處重寫 LinkedHashMap
中 removeEldestEntry
方法, 當緩存新增元素的時候,會判斷當前 map
大小是否超過 DEFAULT_MAX_CAPACITY
,超過則移除map中最老的節點。
緩存清除機制
緩存清除機制與 ConcurrentHashMap
的實現一致,均是通過 timer
實現。
以上就是利用Java如何實現本地緩存,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。