概述
在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小。而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是支持缓存特性的。当然 Spring Boot默认使用的是 SimpleCacheConfiguration,即使用 ConcurrentMapCacheManager 来实现的缓存。但本文将讲述如何将 Guava Cache缓存应用到 Spring Boot应用中。
Guava Cache是一个全内存的本地缓存实现,而且提供了线程安全机制,所以特别适合于代码中已经预料到某些值会被多次调用的场景
下文就上手来摸一摸它,结合对数据库的操作,我们让 Guava Cache作为本地缓存来看一下效果!
1、首先准备一张表

2、引入cache的依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
3、进行简单的配置
@Configuration
@EnableCaching
public class GuavaCacheConfig {
@Bean
public CacheManager cacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
cacheManager.setCacheBuilder(
CacheBuilder.newBuilder().
expireAfterWrite(10, TimeUnit.SECONDS).
maximumSize(1000));
return cacheManager;
}
}
下面是一些Java代码:
首先是mapping
<select id="selectUserByName" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from userinfo
where userName = #{userName , jdbcType=VARCHAR}
</select>
然后是service
@Override
@Cacheable(value = "user", key = "#userName")
public UserInfo getUserByName(@RequestParam String userName) {
Optional<UserInfo> userInfo = Optional.ofNullable(userInfoMapper.selectUserByName(userName));
System.out.println( "从数据库读取,而非读取缓存!" );
return userInfo.orElseThrow(() -> new BizException(-1, "未查询到数据"));
}
然后是controller
@Time("selectByName")
@RequestMapping(value = "/name",method = RequestMethod.GET)
public Response getUserByName(@RequestParam String userName) {
logger.info(">>>>>>>>>> 执行查询方法 ");
return Response.getInstance(userInfoServiceImpl.getUserByName(userName));
}
@Time 注解的使用可以看我之前的博文,这是我自定义实现的注解,用来统计接口响应时间;
下面看一下实现结果:

首先缓存中是没有用户数据的,然后我们请求接口,查询数据库,并将数据存放到缓存中,接下来请求了两次,缓存是10秒失效,所以这两次的数据来源是cache,10秒之后,cache失效,会查询数据库。
参考资料:

本文探讨如何在Spring Boot应用中集成并使用Guava Cache作为本地缓存,以提高程序性能。通过创建数据库表、引入缓存依赖、配置及编写Java代码(包括mapping、service和controller),展示了Guava Cache如何缓存数据库查询结果并自动过期。通过实例,解释了缓存未命中时查询数据库以及缓存10秒后失效的机制。
3447

被折叠的 条评论
为什么被折叠?



