美文网首页
多级缓存之二:本地缓存Guava

多级缓存之二:本地缓存Guava

作者: YoSaukit | 来源:发表于2019-07-16 17:13 被阅读0次

    接上一篇Redis集中式缓存应用,作为缓存的数据库中间件redis的集中式缓存管理。下面使用Guava进行热点数据本地缓存。
    Guava cache本地缓存

    1. 可控制的大小和超时时间
    2. 可配置的LRU策略
    3. 线程安全

    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);
            }
    
    

    相关文章

      网友评论

          本文标题:多级缓存之二:本地缓存Guava

          本文链接:https://www.haomeiwen.com/subject/vkwtlctx.html