某些熱點數據在短期內可能會被成千上萬次訪問,因此除了放在redis以外,還能夠放在本地內存,也就是JVM的內存中。redis
咱們能夠使用google的guava cache組件實現本地緩存,之因此選擇guava是由於它能夠控制key和value的大小和超時時間,能夠配置LRU策略且guava是線程安全的。數據庫
首先引入guava cache緩存
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>
編寫CacheService接口安全
public interface CacheService { //存方法 void setCommonCache(String key,Object value); //取方法 Object getFromCommonCache(String key); }
實現CacheService(@PostConstruct註解的方法將會在依賴注入完成後被自動調用。)app
@Service public class CacheServiceImpl implements CacheService { private Cache<String,Object> commonCache=null; @PostConstruct public void init(){ commonCache= CacheBuilder.newBuilder() //緩存初始容量10 .initialCapacity(10) //最多100個key,超過按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); } }
使用CacheServiceide
@RequestMapping(value = "/get",method = {RequestMethod.GET}) @ResponseBody public CommonReturnType getItem(@RequestParam(name = "id")Integer id){ //在本地緩存中查找 ItemModel itemModel= (ItemModel) cacheService.getFromCommonCache("item_"+id); if(itemModel==null){ //本地緩存沒有則到redis緩存中查找 itemModel= (ItemModel) redisTemplate.opsForValue().get("item_"+id); if(itemModel==null){ //都沒有則到數據庫查找,找到後放入redis中 itemModel = itemService.getItemById(id); redisTemplate.opsForValue().set("item_"+id,itemModel); redisTemplate.expire("item_"+id,10, TimeUnit.MINUTES); } //本地緩存沒有時,在redis或數據庫找到後再放入本地緩存 cacheService.setCommonCache("item_"+id,itemModel); } ItemVO itemVO = convertVOFromModel(itemModel); return CommonReturnType.create(itemVO); }