Google Guava--localcache本地快取例項
阿新 • • 發佈:2019-02-01
何為快取?本地快取類似於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; }