使用guava cache再本地缓存热点数据

Posted skychmz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用guava cache再本地缓存热点数据相关的知识,希望对你有一定的参考价值。

某些热点数据在短时间内可能会被成千上万次访问,所以除了放在redis之外,还可以放在本地内存,也就是JVM的内存中。

我们可以使用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注解的方法将会在依赖注入完成后被自动调用。)

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

使用CacheService

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

    

 

以上是关于使用guava cache再本地缓存热点数据的主要内容,如果未能解决你的问题,请参考以下文章

Guava Cache本地缓存

利用guava来实现本地的cache缓存

SpringBoot加入Guava Cache实现本地缓存

GUAVA本地缓存01_概述优缺点创建方式回收机制监听器统计异步锁定

缓存之王Caffeine Cache,性能比Guava更强,命中率更高!

http缓存协议详解