接上一篇Redis集中式緩存應用暴备,作為緩存的數據庫中間件redis的集中式緩存管理。下面使用Guava進行熱點數據本地緩存缩赛。
Guava cache本地緩存
- 可控制的大小和超時時間
- 可配置的LRU策略
- 線程安全
Guava
-
配置
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
-
封裝本地緩存操作類
CacheService.java
public interface CacheService {
//存方法
void setCommonCache(String key,Object value);
//取方法
Object getFromCommonCache(String key);
}
CacheServiceImpl.java
@Service
public class CacheServiceImpl implements CacheService {
private Cache<String,Object> commonCache = null;
@PostConstruct
public void init(){
commonCache = CacheBuilder.newBuilder()
//設置緩存容器的初始容量為10
.initialCapacity(10)
//設置緩存中最大可存儲100個key,超過100個之后會按照LRU的策略移除緩存項
.maximumSize(100)
//設置寫緩存后多少秒過期
.expireAfterWrite(60, TimeUnit.SECONDS).build();
}
@Override
public void setCommonCache(String key, Object value) {
commonCache.put(key, value);
}
@Override
public Object getFromCommonCache(String key) {
return commonCache.getIfPresent(key);
}
}
-
使用redis+Guava
先查本地緩存,本地緩存沒有再從redis中查找乖订,redis中也沒有再從MySQL中讀取數據,同時把數據填充到reids和本地緩存具练。
ItemModel itemModel = null;
//先去本地緩存
itemModel = (ItemModel) cacheService.getFromCommonCache("item_"+id);
if(itemModel == null){
//根據商品的id到redis內獲取
itemModel = (ItemModel) redisTemplate.opsForValue().get("item_"+id);
//若redis內不存在對應的itemModel,則訪問下游service
if (itemModel == null){
itemModel = itemService.getItemById(id);
//設置itemModel到redis內
redisTemplate.opsForValue().set("item_"+id,itemModel);
redisTemplate.expire("item_"+id,10, TimeUnit.MINUTES);
}
//填充本地緩存
cacheService.setCommonCache("item_"+id,itemModel);
}