使用guava cache在本地緩存熱點數據

某些熱點數據在短期內可能會被成千上萬次訪問,因此除了放在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);

    }
相關文章
相關標籤/搜索