【Java】SpringBoot使用caffeine构建缓存带实例源码

一、什么是caffeine

Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。

缓存和ConcurrentMap有点相似,但还是有所区别。最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine的缓存Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。在某些场景下,LoadingCacheAsyncLoadingCache 因为其自动加载缓存的能力将会变得非常实用。

Caffeine提供了灵活的构造器去创建一个拥有下列特性的缓存:

  • 自动加载元素到缓存当中,异步加载的方式也可供选择
  • 当达到最大容量的时候可以使用基于就近度和频率的算法进行基于容量的驱逐
  • 将根据缓存中的元素上一次访问或者被修改的时间进行基于过期时间的驱逐
  • 当向缓存中一个已经过时的元素进行访问的时候将会进行异步刷新
  • key将自动被弱引用所封装
  • value将自动被弱引用或者软引用所封装
  • 驱逐(或移除)缓存中的元素时将会进行通知
  • 写入传播到一个外部数据源当中
  • 持续计算缓存的访问统计指标

二、SpringBoot整合caffeine

1. SpringBoot项目基础运行

本次项目基于SpringBoot官方rest接口示例的完成部分进行演示

spring-guides/gs-rest-service: Building a RESTful Web Service :: Learn how to create a RESTful web service with Spring. (github.com)

这里我们使用完成部分 gs-rest-service/complete at main · spring-guides/gs-rest-service (github.com)

image-20211026103802022

为了不和本地项目发生端口冲突,在项目中添加配置文件,修改端口号

image-20211026104557347

server:
  port: 8100
  servlet:
    encoding:
      charset: UTF-8
      force: true

先运行项目试试

./mvnw spring-boot:run

image-20211026105551691

2. 基于maven安装caffeine

目前caffeine的版本是3.0.4

com.github.ben-manes.caffeine : caffeine : 3.0.4 - Maven Central Repository Search

添加依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
  <groupId>com.github.ben-manes.caffeine</groupId>
  <artifactId>caffeine</artifactId>
  <version>3.0.4</version>
</dependency>

安装依赖

IDEA会帮我们完成依赖的安装。。。

image-20211027170636369

3. 缓存注解说明

我们通过一个路由设置缓存,并通过一个路由读取缓存

SpringBoot调用Caffeine,使用的是通用的缓存注解。

Cache Providers的加载顺序如下

image-20211028113053448

我们使用的注解为

  • @CacheEvict 主动清除缓存

  • @Cacheable 获取缓存

  • 在类上的注解 @EnableCaching 表示开启缓存

业务上的流程为

  1. Cacheable 从缓存取数据,没有就按业务拿到数据,并保存到缓存,返回数据 相当于 getOrSet
  2. CacheEvict 写入业务中触发清理缓存

4. 实际代码

1)修改配置文件application.yml

增加缓存配置

server:
  port: 8100
  servlet:
    encoding:
      charset: UTF-8
      force: true
spring:
  cache:
    type: caffeine

2) 类的注解 @EnableCaching 启用缓存

@EnableCaching
public class CacheController {

3) 方法的获取缓存 @Cacheable

我这里简化了内部逻辑,每次返回一个随机的数字,如果有缓存就会一直返回同一个数字。

    @GetMapping("/cache")
    @Cacheable(cacheNames = {"cache"})
    public double cacheSet(@RequestParam(value = "key") String key){
        return Math.random();
    }

4) 主动清理缓存 @CacheEvict

这里也使用get的原因是为了方便调试。

    @GetMapping("/cache/clear")
    @CacheEvict(cacheNames = {"cache"})
    public void cacheClear(@RequestParam(value = "key") String key){

    }

5. 运行效果

运行项目

./mvnw spring-boot:run

本地访问 http://localhost:8100/cache?key=diandianxiyu_geek

多次访问,发现得到的是相同的结果,表示缓存成功读取

image-20211028143958935

访问清理缓存地址 http://localhost:8100/cache/clear?key=diandianxiyu_geek

因为没有设置返回值,所以没有输出

再次访问http://localhost:8100/cache?key=diandianxiyu_geek 发现结果发生变化,表示缓存已被清理,并重建。

image-20211028144151413

6. 本文项目源码

本文项目源码已经托管在codechina上,可以直接克隆并运行。

小雨同学的服务器果然有问题 / springboot-caffeine · CODE CHINA (csdn.net)

三、参考资料

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雨青年

程序员可以把咖啡转化成代码~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值