[Google Guava]學習--緩存cache

適用性

  緩存在不少狀況下很是實用。例如,計算或檢索一個值的代價很高,而且對一樣的輸入須要不止一次獲取值的時候,就應當考慮使用緩存。html

  Guava CacheConcurrentMap很類似,但也不徹底同樣。最基本的區別是ConcurrentMap會一直保存所添加的元素,直到顯式的移除Guava Cache爲了限制內存的佔用,一般都是設定爲自動回收元素。在某些場景下,儘管LoadingCahe不回收元素,可是它仍是頗有用的,由於它會自動加載緩存。java

  Guava Cache適用場景:git

  • 你願意消耗一部份內存來提高速度;
  • 你已經預料某些值會被屢次調用;
  • 緩存數據不會超過內存總量;

 Guava Cache是一個全內存的本地緩存實現,它提供了線程安全的實現機制。總體上來講Guava cache 是本地緩存的不二之選,簡單易用,性能好。redis

建立方式

  CacheLoaderCallable經過這兩種方法建立的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);  
    }
相關文章
相關標籤/搜索