1. 程式人生 > >Google Guava--localcache本地快取例項

Google Guava--localcache本地快取例項

何為快取?本地快取類似於map,當給定一個key,首先查詢快取中是否已經有值了,如果有則直接返回資料;相反如果不存在這樣的key,則將新的內容value值快取起來,以便下一次來查詢,可以快速返回。

當然快取不是說value值一直不變,會按照一定的失效策略來更新快取中的資料。

快取的常用使用場景有:

(1)在高併發的資料庫訪問時,為了抗住資料庫併發連線壓力,將資料快取起來,當有請求過來,直接返回資料;

(2)當應用綜的資料,更新週期較長,而且每次都查資料庫的情況下,可以採用週期更新資料,從而有效減少資料庫無效的訪問,保證效率;

google的guava庫中有實現了localcache的現成方法,可以在應用中快速構建本地快取。

在快取中,最為重要的失效策略和唯一key的確定;

基於時間的移除
      guava提供了兩個基於時間移除的方法
      expireAfterAccess(long, TimeUnit)  這個方法是根據某個鍵值對最後一次訪問之後多少時間後移除;
      expireAfterWrite(long, TimeUnit)    這個方法是根據某個鍵值對被建立或值被替換後多少時間移除;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import java.util.concurrent.TimeUnit;

/**
 * 本地快取服務配置
 * User: jian-fei
 */
public class LocalContentCache {
    public final static long expireTime = 5;  //分鐘
    public static Cache<String,Object> localContentCache = CacheBuilder.newBuilder().expireAfterAccess(
expireTime,TimeUnit.MINUTES).build();
}
//產生快取唯一key的方法 
public String generateLocalCacheKey(String model,String key){
        return model + "_" + key;
    }

    public Object handle(final String model,final String key,final Object parmObject) {
        Object tx =  null;
        //從內部快取讀出key
        String cacheKey = generateLocalCacheKey(model,key);
        try{
            tx = LocalContentCache.localContentCache.get(cacheKey,new Callable<Object>() {
                @Override
                public Object call() throws Exception {
                    Object result = null;
                    //處理,獲取快取的value值
                    return result;
                }
            });
        }catch (ExecutionException e){
            throw new RuntimeException(e);
        }
        return tx;
    }