Guava Cache本地缓存在 Spring Boot应用中的实践

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

 

概述

在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小。而 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失效,会查询数据库。

参考资料:

1、Guava Cache本地缓存在 Spring Boot应用中的实践

2、Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值