分级缓存和本地热点缓存的实现

分级缓存

  • 第一级缓存:JVM本地内存
  • 第二级缓存:Redis缓存
  • 第三级缓存:数据库

实现思路。请求发来的时候先到第一级热点缓存寻找,如果没有则去第二级,最后去第三级。找到需要的数据后将数据存入到第一级或者第二级缓存中。

本地热点缓存使用的是Guava cache实现的

引入依赖

                
			com.google.guava
			guava
			18.0
		

定义Cache Service层的接口和实现类

public interface CacheService {

    //将热点数据key,value存入到本地内存
    void setCommonCache(String key,Object value);

    //取方法
    Object getFromCommonCache(String key);
}
@Service
public class CacheServiceImpl implements CacheService {

    private Cache commonCache = null;

    //此注解在Spring进行工厂实例化的时候会优先加载
    @PostConstruct
    public void init(){
        commonCache = CacheBuilder.newBuilder()
                //设置缓存容器的初始容量为10
                .initialCapacity(10)
                //设置缓存中最大可以存储100个key,超过100会按lru策略淘汰
                .maximumSize(100)
                //设置缓存写入后多少秒过期
                .expireAfterWrite(60,TimeUnit.SECONDS).build();
    }
}

进行逻辑处理

 ItemModel itemModel = null;

        //先从本地缓存加载
        itemModel = (ItemModel) cacheService.getFromCommonCache("item_"+id);

        //本地缓存不存在数据
        if (itemModel == null) {
            //从redis缓存获取获取商品信息
            itemModel = (ItemModel) redisTemplate.opsForValue().get("item_"+id);

            //如果redis获取到的缓存为空,进行Service层获取
            if (itemModel == null) {
                itemModel = itemService.getItemById(id);
                if (itemModel == null) {
                    throw new BusinessException(EmBusinessError.ITEM_NOT_EXIT);
                }else {
                    redisTemplate.opsForValue().set("item_"+id,itemModel);
                    redisTemplate.expire("item_"+id,10, TimeUnit.MINUTES);
                }
            }
            //将数据加载到本地缓存
            cacheService.setCommonCache("item_"+id,itemModel);
        }

你可能感兴趣的:(JAVA)