最近幾天由於工作原因,需要設計實現乙個執行緒安全的快取機制,拿出來和大家分享交流一下。
快取是在實際工作中經常用到的,主要作用呢?1. 提高響應速度 2. 降低cpu壓力或者資料庫壓力。
在此,我的應用背景是攔截一些rpc請求(
不要求獲取實時資料),且rpc請求無引數,即主要是應對一些資料全量同步的請求(那麼快取的key是請求的函式名,value是返回值)。提供快取實現,以降低資料庫及自身應用的訪問壓力。
高可擴充套件性:可以方便配置需要使用快取的方法。
執行緒安全性:在併發情況下,要求執行緒安全,且盡可能高效。
示意圖:
針對某一時刻併發數較多且快取失效的情況下,我們應該保證的是只有乙個執行緒會去執行資料的讀取並設定的操作,那麼其他執行緒應該是等待該執行緒完成操作再一起返回還是直接返回null值?
答:在併發數較多且資料準備時間過長的情況下,如果執行緒採取等待策略,那麼將引起很大的資源浪費:占用rpc連線(一般數量是有限制的),占用伺服器cpu時間等等問題。所以,最好是**中提供兩種策略,對於執行時間較長的讀資料操作,我們應該將執行緒直接返回,而非一直等待。
annotation:
/**
* 表示乙個方法是否啟用本地快取,可以指定本地快取的時間間隔,預設為乙個小時
*/@retention(retentionpolicy.runtime)
@target(elementtype.method)
public @inte***ce localcacheoperation
cacheobject:
//為快取物件包上一層時間戳
public class cacheobject implements serializable
標記要使用快取的方法:
public inte***ce configservice
public class configserviceimpl implements configservice
@localcacheoperation
public bloomfiltergetalltrades()
}
/**
* 本地快取切面實現
*/@aspect
public class localcacheaspect
/*** advice aound audit operations
* * @param pjpparam
* @return
*/@around("execution(@localcacheoperation * *(..))")
public object docache(proceedingjoinpoint pjpparam) throws throwable
final proceedingjoinpoint pjp = pjpparam;
signature sig = pjp.getsignature();
if (sig instanceof methodsignature) else
if (localcachelocks.containskey(msig.getmethod().getname()))
while (true)
if (f == null)
catch (throwable e)
cacheobject cacheobject = new cacheobject();
cacheobject.setobject(res);
cacheobject.settimestamp(system.currenttimemillis());
return cacheobject;}};
futuretaskft =
new futuretask(eval);
f = localcache.putifabsent(localcachekey, ft);
if (f == null)
}cacheobject obj = f.get();
if (obj != null)
return obj.getobject();
}catch (cancellationexception e)
catch (executionexception e) }}
return pjp.proceed(pjp.getargs());
}@suppresswarnings("static-access")
public object doconcurrentlocalcache(proceedingjoinpoint pjp,
long localcacheinterval, string localcachekey) throws throwable else if (weakrefcacheobj != null && weakrefcacheobj.get() != null)
if (this.localcachelocks.get(localcachekey).trylock())
try finally
} else
} catch (exception e) }}
HTTP請求的快取(Cache)機制
先來一張圖 下面簡單的來描述一下http cache機制 當資源資源第一次被訪問的時候,http status返回200,在頭部攜帶當前資源的描述資訊,eg 同時瀏覽器會將資源快取到cache目錄,並儲存檔案描述資訊。當客戶端第二次請求資源時,會先檢查cache目錄中是否含有該資源,如果有,並且還沒...
java 快取機制 實現的原理?
所謂快取,就是將程式或系統經常要呼叫的物件存在記憶體中,一遍其使用時可以快速呼叫,不必再去建立新的重複的例項。這樣做可以減少系統開銷,提高系統效率。快取機制的實現有很多中,這裡講一種。public class cacheimmutale 返回方法 public string getname 返回物件...
python實現檔案內容全量的copy
coding utf 8 import re import os,os.path def file cp path,path2 path path2 d testpy test config.properties if not os.path.exists path2 print file not ...