java物件本地快取機制的實現
本地快取機制,利用java.util.concurrent,很好的管理本地記憶體儲存的物件內容。
建立屬性:
/**
* 具體內容存放的地方
*/
private ConcurrentHashMap<String, Object>[] caches;
/**
* 超期資訊儲存
*/
private ConcurrentHashMap<String, Long> expiryCache;
/**
* 清理超期內容的服務
*/
private ScheduledExecutorService scheduleService;
/**
* 清理超期資訊的時間間隔,預設10分鐘
*/
private int expiryInterval = 5;
/**
* 內部cache的個數,根據key的hash對module取模來定位到具體的某一個內部的Map,
*/
private int moduleSize = 10;
建立構造器:
public MyLocalCache() {
caches = new ConcurrentHashMap[moduleSize];
for (int i = 0; i < moduleSize; i++) {
caches[i] = new ConcurrentHashMap<String, Object>();
}
expiryCache = new ConcurrentHashMap<String, Long>();
scheduleService = Executors.newScheduledThreadPool(1);
//後臺定時維護執行緒
scheduleService.scheduleAtFixedRate(getRemoveLocalCacheTask(), 0, 60L * expiryInterval, TimeUnit.SECONDS);
}
定義快取的get和put方法:
/**
* 將資料放入快取中
* @param key
* @param value
* @param TTL 秒
* @return
*/
public Object put(String key, Object value, int TTL) {
Object result = null;
ConcurrentHashMap<String, Object> cache = getCache(key);
if (cache != null && cache.size() < 10240) {
result = cache.put(key, value);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, TTL);
expiryCache.put(key, calendar.getTime().getTime());
}
return result;
}
public Object get(String key) {
checkValidate(key);
return getCache(key).get(key);
}
//根據key獲取cache容器
private ConcurrentHashMap<String, Object> getCache(String key) {
long hashCode = (long) key.hashCode();
if (hashCode < 0) {
hashCode = -hashCode;
}
int moudleNum = (int) (hashCode % moduleSize);
return caches[moudleNum];
}
校驗key是否過期,如果過期了,就要移除
private void checkValidate(String key) {
if (key != null) {
Long expiryTime = expiryCache.get(key);
if (expiryTime != null && expiryTime != -1
&& new Date(expiryTime).before(new Date())) {
ConcurrentHashMap<String, Object> cache = getCache(key);
if (cache != null) {
cache.remove(key);
}
expiryCache.remove(key);
}
}
}
清除所有的快取: key和內容 全部清空
public boolean clear() {
if (caches != null) {
for (ConcurrentHashMap<String, Object> cache : caches) {
cache.clear();
}
}
if (expiryCache != null) {
expiryCache.clear();
}
return true;
}
定時器: 檢查過期內容
public Runnable getRemoveLocalCacheTask() {
return new Runnable() {
@Override
public void run() {
try {
for (ConcurrentHashMap<String, Object> cache : caches) {
Iterator<String> keys = cache.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
if (expiryCache.get(key) == null) {
continue;
}
long date = expiryCache.get(key);
if ((date > 0) && (new Date(date).before(new Date()))) {
expiryCache.remove(key);
cache.remove(key);
}
}
}
logger.debug("MingpinLocalCache CheckService check() is run!");
} catch (Exception ex) {
logger.error(ex);
}
}
};
}
相關推薦
java物件本地快取機制的實現
本地快取機制,利用java.util.concurrent,很好的管理本地記憶體儲存的物件內容。 建立屬性: /** * 具體內容存放的地方 */ private ConcurrentHashMap<String, Object>
Java自動過期本地快取簡單實現
實際專案中常常需要用到本地快取,特別是一些固定不變的資料,不想頻繁調介面,因為http請求本身需要耗時,下面幾個類對本地快取作了簡單實現,支援自動過期功能LocalCache.javainterface LocalCache { public void refresh()
如何利用快取機制實現JAVA類反射效能提升30倍
一次效能提高30倍的JAVA類反射效能優化實踐 文章來源:宜信技術學院 & 宜信支付結算團隊技術分享第4期-支付結算部支付研發團隊高階工程師陶紅《JAVA類反射技術&優化》 分享者:宜信支付結算部支付研發團隊高階工程師陶紅 原文首發於宜信支付結算技術團隊公號:野指標 在實際工作中的一些特定
java物件序列化機制
1.定義 java物件序列化機制允許實現了Serializable/Externalizable介面的java物件永久性地儲存到計算機的磁碟中,或則允許java物件直接在網路中傳輸,擺脫平臺的限制。反序列化即使將IO流中的位元組序列轉化為java物件。 2.原理 3.使用 序列化: 1)一個實現了S
java 中間變數快取機制(i++,++i)
public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); }
java呼叫本地攝像頭,實現人臉識別
package com.lw.test; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.imag
Java物件的強、軟、弱和虛引用原理+結合ReferenceQueue物件構造Java物件的快取記憶體器
轉自:http://blog.csdn.net/lyfi01/article/details/6415726 1.Java物件的強、軟、弱和虛引用 在JDK 1.2以前的版本中,若一個物件不被任何變數引用,那麼程式就無法再使用這個物件。也就是說,只有物件處於可觸及(re
java物件的快取
先了看一段非常有意思的程式碼 public class TestIntegerCache { public static void main(String[] args) { Integer a = 12; In
Java 物件序列化機制詳解
物件序列化的目標:將物件儲存到磁碟中,或允許在網路中直接傳輸物件。 物件序列化機制允許把記憶體中的Java物件轉換成平臺無關的二進位制流,從而允許把這種二進位制流持久的儲存在磁碟上,通過網路將這種二進位制流傳輸到另一個網路節點。其他程式一旦獲得了這種二進位制流,都可以講這種
Java物件構建快取記憶體器
Java物件引用+ReferenceQueue實現Java物件的快取記憶體 Java物件的強、軟、弱和虛引用(使程式能更加靈活地控制物件的生命週期): 1.強引用(StrongReference):最普遍的引用,物件具有強引用,記憶體空間不足,JVM寧願丟
前端幾種本地快取機制
2. Session 說到Cookie就不能不說Session。 Session機制。session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個se
常見面試題之作業系統中的LRU快取機制實現
LRU快取機制,全稱Least Recently Used,字面意思就是最近最少使用,是一種快取淘汰策略。換句話說,**LRU機制就是認為最近使用的資料是有用的,很久沒用過的資料是無用的,當記憶體滿了就優先刪除很久沒有使用的資料**。 基於LeetCode146,可以使用**雜湊連結串列**或者**自定義雙
LeetCode 146. LRU快取機制(java實現)
參考解答 總結:這道題主要要知道選取何種資料結構並且在 O(1) 時間複雜度內完成這兩種操作? O(1) 的get方法肯定要用到HashMap() LinkedList(雙向連結串列)可以以O(1)時間複雜度,很方便地實現資料的插入和刪除 所以,將兩個資料結構聯合使用,Ha
java物件中的三種狀態和髒檢查及重新整理快取機制
瞬時狀態 瞬時狀態又稱臨時狀態.如果java物件與資料庫中的資料沒有任何的關聯,即此java物件在資料庫中沒有相關聯的記錄,此時java物件的狀態為瞬時狀態,session對於 瞬時狀態的ava物件是一無所知的,當物件不再被其他物件引用時,它的所有資料也就丟失了,物件將會被java虛擬機器按照垃圾回收
Java ConcurrentHashmap實現Localcache本地快取
很多場景下,有些請求的資料,是不會經常改變的,這種時候,為了減少資料庫的查詢壓力,可以將這一部分資料放入快取中,直接從快取中讀取。除了一些像Redis等快取外,還可以通過本地記憶體,作為快取。下邊將使用ConcurrentHashMap來實現本地快取。 >相關的技術:
利用Java反射機制實現物件相同欄位的複製
一、如何實現不同型別物件之間的複製問題? 1、為什麼會有這個問題? 近來在進行一個專案開發的時候,為了隱藏後端資料庫表結構、同時也為了配合給前端一個更友好的API介面文件(swagger API文件),我採用POJO來對應資料表結構,使用VO來給傳遞前端要展示的資料,同時使用DTO來進行請求
(小工具)Java反射機制實現任意物件集合按指定任意欄位進行分組通用程式實踐
在應用開發的時候,我們有時候會遇到需要對一個給定集合進行分組的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後group by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行分
(小工具)Java反射機制實現任意物件集合排序並且獲取排列名次的通用程式實踐
在應用開發的時候,我們有時候會遇到需要對一個給定集合進行排序的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後order by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行排
mybatis實現物件之間的關係(一對一、一對多、多對多)以及mybatis的快取機制
一、業務需求中物件之間的關係在實際的開發當中,不僅要對錶與表之間的關係進行的詳細分析,也要針對在業務意義上物件之間的關係,通常的關係為:一對一、一對多、多對多;二、針對使用mybatis處理這三種關係1、業務模型說明這裡用用使用者表、訂單表、訂單詳情表、商品表著四張表之間,說
java實現本地快取
這裡本地快取的含義是 多個執行緒公用的一個靜態的Map物件 作用是減少db或cache的查詢次數。 使用場景為靜態或者非敏感資料。 也可以使用google的guava cache等 快取類 import lombok.AllArgsConstructor; import