LoadingCache<String, List<Order>> cacheOrders = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES)//表示在寫入內存1分鍾后該數據過期
.expireAfterAccess(1, TimeUnit.MINUTES)//表示如果1分鍾之內沒有使用該緩存則數據過期 每調用一次緩存有效時間都刷新為一分鍾
.refreshAfterWrite(1, TimeUnit.MINUTES)//只阻塞當前數據加載線程,其他線程返回舊值
.concurrencyLevel(8)//設置並發級別為8,並發級別是指可以同時寫緩存的線程數
.maximumSize(100)//設置最大緩存數 超過限制采用最少使用淘汰機制
.build(new CacheLoader<String, List<Order>>() {
/** 當本地緩存命沒有中時,調用load方法獲取結果並將結果緩存
*/
@Override
public List<Order> load(String key) {
return getOrders();
}
// 此時一般我們會進行相關處理,如到數據庫去查詢
private List<Order> getOrders() {
List<Order> orderList = (List<Order>) redisUtil.hmGet(redisTemplate, ControlConstants.RTB_OF_ORDER, ControlConstants.DSP_RTB_AREA_DEAL);
log.info("緩存失效重新獲取訂單" + orderList.size());
return orderList;
}
});
當然,除此之外,緩存還有其他初始化設置,例如設置要統計緩存的命中率等,guava的緩存還可以以異步線程的方式刷新本地的緩存,這里不做詳細說明