Spring Boot+Guava Cache+@EnableCaching

2024-06-16 05:58

本文主要是介绍Spring Boot+Guava Cache+@EnableCaching,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spring Boot集成Guava Cache并配合@EnableCaching注解管理本地缓存

依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.6-jre</version>
</dependency>

Guava缓存集成

GuavaCacheConfig:

@EnableConfigurationProperties(GuavaProperties.class)
@EnableCaching
@Configuration
public class GuavaCacheConfig {@Autowiredprivate GuavaProperties guavaProperties;@Beanpublic CacheBuilder<Object, Object> cacheBuilder() {long maximumSize = guavaProperties.getMaximumSize();long duration = guavaProperties.getExpireAfterAccessDuration();if (maximumSize <= 0) {maximumSize = 1024;}if (duration <= 0) {duration = 1800;}return CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(duration, TimeUnit.SECONDS);}/*** expireAfterAccess: 当缓存项在指定的时间段内没有被读或写就会被回收。* expireAfterWrite:当缓存项在指定的时间段内没有更新就会被回收,如果我们认为缓存数据在一段时间后数据不再可用,那么可以使用该种策略。* refreshAfterWrite:当缓存项上一次更新操作之后的多久会被刷新。* @return*/@DependsOn({"cacheBuilder"})@Beanpublic CacheManager cacheManager(CacheBuilder<Object, Object> cacheBuilder) {GuavaCacheManager cacheManager = new GuavaCacheManager();cacheManager.setCacheBuilder(cacheBuilder);return cacheManager;}}

GuavaProperties:

@ConfigurationProperties(prefix = "guava.cache.config")
public class GuavaProperties {private long maximumSize;private long maximumWeight;private long expireAfterWriteDuration;private long expireAfterAccessDuration;private long refreshDuration;private int initialCapacity;private int concurrencyLevel;// get/set忽略
}

为了方便测试设置缓存过期时间为10秒

application.properties:

server.port=8081
guava.cache.config.expire-after-access-duration=10

缓存测试

CacheService:

@Service
public class CacheService {@CachePut(value = "guavacache")public long save() {long timestamp = new Timestamp(System.currentTimeMillis()).getTime();System.out.println("进行缓存:" + timestamp);return timestamp;}@CacheEvict(value = "guavacache")public void delete() {System.out.println("删除缓存");}@Cacheable(value = "guavacache")public long getByCache() {try {Thread.sleep(3 * 1000);} catch (InterruptedException e) {e.printStackTrace();}return new Timestamp(System.currentTimeMillis()).getTime();}
}

CacheController:

@RestController
@RequestMapping("/cache")
public class CacheController {@Autowiredprivate CacheService cacheService;/*** 查询方法*/@RequestMapping(value = "", method = RequestMethod.GET)public String getByCache() {Long startTime = System.currentTimeMillis();long timestamp = this.cacheService.getByCache();Long endTime = System.currentTimeMillis();System.out.println("耗时: " + (endTime - startTime));return timestamp+"ms";}/*** 保存方法*/@RequestMapping(value = "", method = RequestMethod.POST)public void save() {this.cacheService.save();}/*** 删除方法*/@RequestMapping(value = "", method = RequestMethod.DELETE)public void delete() {this.cacheService.delete();}
}

get方法访问localhost:8081/cache/,控制台输出:

耗时: 3007ms

在10s内访问,输出:

耗时: 1ms

说明,getByCache方法直接从缓存获取结果,线程没有执行到sleep方法,缓存成功。

其它方法可自行测试。

源码地址:
https://gitee.com/yidasanqian/spring-boot-guava-cache-demo.git

这篇关于Spring Boot+Guava Cache+@EnableCaching的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065632

相关文章

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

java中XML的使用全过程

《java中XML的使用全过程》:本文主要介绍java中XML的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录什么是XML特点XML作用XML的编写语法基本语法特殊字符编写约束XML的书写格式DTD文档schema文档解析XML的方法​​DOM解析XM

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化