java使用guava cache实现本地缓存 原创 2021-02-04 15:39:55.0 阅读(4854)次 在高并发的场景中我们不希望所有请求都打到数据库中,以免压垮数据库,这时我们就可能会使用本地缓存来实现解决并发性能问题,当然我们也可以选择redis来实现,但redis有时并发也并没有那么快。于是本地缓存就是我们的唯一救命手段了。 Guava的cache是线程安全的,是本地缓存的不二之选,默认情况下缓存过期是依赖于访问判断时间过期和数量限制过期。 我们再也不用自己手写一个基于ConcurrentHashMap的本地缓存了 #### maven引入guava包 ```html com.google.guava guava 18.0 ``` #### 两种缓存方式 guava的缓存提供两种方式: ###### 1. 一种是在创建缓存时就提供加载缓存的方法load,在调用缓存时不用关注缓存数据从哪来,cache过期时会自动调用load去数据库或其他组件刷新缓存并返回给调用者。 ###### 2. 还有一种就是缓存失效后数据需要调用者手动更新缓存。 这两种方式大家可以根据场景去选择。 下面我提供一下我的代码示例,我的需求是要取缓存中的车牌,判断车辆是否存在缓存中,存在就不入库了。 #### 自动加载缓存方式 代码示例: ```java import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component public class VehicleNumCacheOnLoad { private static Logger logger = LoggerFactory.getLogger(VehicleNumCacheOnLoad.class); private final Integer existFlag = new Integer(1); private LoadingCache cache = CacheBuilder.newBuilder() .recordStats() .maximumSize(5000000) .expireAfterWrite(1, TimeUnit.MINUTES) .build( new CacheLoader() { @Override public Integer load(String key) throws Exception { //伪代码: //查询数据库并返回existFlag //return existFlag; //数据库中查询不到,返回null return null; } } ); } ``` #### 手动加载缓存方式 代码示例: ```java import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component public class VehicleNumCache { private static Logger logger = LoggerFactory.getLogger(VehicleNumCache.class); private final Integer existFlag = new Integer(1); private Cache cache = CacheBuilder.newBuilder() .recordStats() .maximumSize(5000000) .expireAfterWrite(1, TimeUnit.MINUTES) .build(); /** * 返回是否存在车辆,非null为存在 * @param vehicleNum * @return */ public Integer get(String vehicleNum){ logger.info(cache.stats().toString()); return cache.getIfPresent(vehicleNum); } /** * 返回是否存在车辆,非null为存在 * @param vehicleNum * @return */ public void put(String vehicleNum){ cache.put(vehicleNum,existFlag); } } ``` #### 如何调用 代码示例: ```java Integer flag = vehicleNumCache.get(vehicleNum); //缓存不存在 if(flag == null){ filterVehicleList.add(v); } ``` 调用前记得注入缓存类vehicleNumCache java java基础 上一篇:java stream List转Map与List转List与Map转List以及List转Map 下一篇:java使用BufferedImage放大或缩小图片
相关文章 java List数据内存分页(3084) java阻塞的线程安全的优先级队列PriorityBlockingQueue(1969) java Map通过遍历器Iterator来实现遍历过程中删除元素来避免ConcurrentModificationException异常(1136) java程序员多线程常见的代码bug(1657) 如何缩小jre1.8(1467) java DelayQueue延时队列的应用(1175) 设置jar包启动的JDK来选择要运行的jdk版本(3902) java stream去重的几种方式(41056) java接口中定义成员变量后会被不同实现类修改,别忘记接口变量默认是public static final(2605) idea中运行springboot jsp工程找不到页面的问题(1188) 推荐文章 使用spring4实现websocket连接(1) Parameter index out of range (1 > number of parameters, which is 0(7) spring cloud+feign+mybatis中使用seata0.9实现分布式事务(7) spring cloud gateway报错Only one connection receive subscriber allowed(82) spring cloud中Feign调用诡异报错MethodNotAllowed: status 405 reading(116) elasticsearch7.1保存时报错: Validation Failed: 1: type is missing;(7) 聊聊数据保存到MySQL后数据乱码的问题(1) jquery对象与dom对象互转(1) linux使用epel源yum安装iftop、nload、nginx等(2) linux下nginx安装其他模块(1) 热门文章 java stream去重的几种方式(40819) the dependencies of some of the beans in the application context form a cycle(16324) 解决mybatis打印查询结果集造成太多日志的问题(9839) java enum枚举转list和Map(9722) java stream List转Map与List转List与Map转List以及List转Map(8468) ServletRequest转HttpServletRequest设置header之后取不到header的问题(8434) java中BufferedImage转成 base64字符串(8098) 切分List集合为多个List集合(7385) maven修改jar包版本不生效解决办法(6990) bootstrap.yml配置报错:Could not resolve placeholder 'xx' in value (6949) 标签列表 java java java java java java java基础 微服务 异常处理 mysql clickhouse clickhouse clickhouse clickhouse clickhouse spring cloud spring boot linux elasticsearch feign jdbc spring js docker postgresql solr seata nginx maven gateway hsqldb 数据库 架构 大数据分析 分布式事务 redis canal dubbo hadoop 消息队列 win10 websocket springmvc git html select2 mybatis jenkins rocketmq quartz activemq 数据库集群 ajax bat 电脑 笔记 eclipse 设计模式 阿里云 github freemarker jvm jquery javamail redission redission对象 hystrix http hibernate springmail svn ubuntu ueditor xheditor zookeeper 分布式 小程序 开发工具 gitlab