緩存在不少狀況下很是實用。例如,計算或檢索一個值的代價很高,而且對一樣的輸入須要不止一次獲取值的時候,就應當考慮使用緩存。html
Guava Cache與ConcurrentMap很類似,但也不徹底同樣。最基本的區別是ConcurrentMap會一直保存所添加的元素,直到顯式的移除;Guava Cache爲了限制內存的佔用,一般都是設定爲自動回收元素。在某些場景下,儘管LoadingCahe不回收元素,可是它仍是頗有用的,由於它會自動加載緩存。java
Guava Cache適用場景:git
Guava Cache是一個全內存的本地緩存實現,它提供了線程安全的實現機制。總體上來講Guava cache 是本地緩存的不二之選,簡單易用,性能好。redis
CacheLoader和Callable經過這兩種方法建立的cache,和一般用map來緩存的作法比,不一樣在於這兩種方法都實現了一種邏輯——從緩存中取key X的值,若是該值已經緩存過了,則返回緩存中的值,若是沒有緩存過,能夠經過某個方法來獲取這個值。數據庫
但不一樣的在於cacheloader的定義比較寬泛, 是針對整個cache定義的,能夠認爲是統一的根據key值load value的方法。而callable的方式較爲靈活,容許你在get的時候指定。api
一、CacheLoader緩存
public class AppkeyInfoLocalCache { private static Logger log = Logger.getLogger(AppkeyInfoLocalCache.class); static LoadingCache<String, AppkeyInfoBasic> cache = CacheBuilder.newBuilder().refreshAfterWrite(3, TimeUnit.HOURS)// 給定時間內沒有被讀/寫訪問,則回收。 .expireAfterAccess(APIConstants.TOKEN_VALID_TIME, TimeUnit.HOURS)// 緩存過時時間和redis緩存時長同樣 .maximumSize(1000).// 設置緩存個數 build(new CacheLoader<String, AppkeyInfoBasic>() { @Override /** 當本地緩存命沒有中時,調用load方法獲取結果並將結果緩存 **/ public AppkeyInfoBasic load(String appKey) throws DaoException { return getAppkeyInfo(appKey); } /** 數據庫進行查詢 **/ private AppkeyInfoBasic getAppkeyInfo(String appKey) throws DaoException { log.info("method<getAppkeyInfo> get AppkeyInfo form DB appkey<" + appKey + ">"); return ((AppkeyInfoMapper) SpringContextHolder.getBean("appkeyInfoMapper")) .selectAppkeyInfoByAppKey(appKey); } }); public static AppkeyInfoBasic getAppkeyInfoByAppkey(String appKey) throws DaoException, ExecutionException { log.info("method<getAppkeyInfoByAppkey> appkey<" + appKey + ">"); return cache.get(appKey); } }
二、Callable安全
public void testcallableCache()throws Exception{ Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build(); String resultVal = cache.get("jerry", new Callable<String>() { public String call() { String strProValue="hello "+"jerry"+"!"; return strProValue; } }); System.out.println("jerry value : " + resultVal); resultVal = cache.get("peida", new Callable<String>() { public String call() { String strProValue="hello "+"peida"+"!"; return strProValue; } }); System.out.println("peida value : " + resultVal); }