0


【Caffeine】⭐️SpringBoot 项目整合 Caffeine 实现本地缓存

🍸前言

  1. 小伙伴们大家好,缓存是提升系统性能的一个不可或缺的工具,通过缓存可以避免大部分重复的请求到数据库层,减少IO链接次数,提升整体的响应速率;具体的缓存工具可以分为本地缓存和分布式缓存(比如 redis),优先使用本地缓存,因为一般情况下使用分布式缓存有点大材小用了;本地缓存中比较常见的比如 Caffeine 缓存,这篇文章将结合具体的 Springboot 项目搭配 Caffeine 实现本地缓存的各种使用方式

🍻一、Caffeine

  1. Caffeine 是一个现代化的 Java 缓存库,设计用于提供高性能和可伸缩性的本地缓存解决方案。适用于高并发以及快速访问数据的场景,因为内部实现了基于 ConcurrentHashMap 的数据结构,从而保证并发访问时的线程安全和高性能。
  2. Spring Framework 中,通常通过 Spring Cache 抽象来使用 Caffeine 缓存,常用的注解包括:
  • @Cacheable:- 用于标记方法可以使用缓存。当方法被调用时,Spring 会首先检查缓存中是否存在对应的数据,如果存在则直接返回缓存中的数据,否则执行方法并将返回值存入缓存。
  • @CachePut:- 用于更新缓存中的数据。与 @Cacheable 不同的是,@CachePut 注解的方法始终会执行,并将执行结果存入指定的缓存中,适用于更新操作后需要同步更新缓存的场景。
  • @CacheEvict:- 用于从缓存中移除一个或多个条目。可以通过指定的 key 或条件来移除缓存中的数据,常用于执行删除操作后清除相应的缓存条目,以保证数据一致性。

🍺二、项目实践

2.1 环境准备
  1. 后续测试是基于一个可运行的 SpringBoot 项目,通过 ApiPost 模拟请求测试缓存接口
2.2 项目搭建
  1. 2.2.1 依赖引入 + 配置
  2. 在项目的 pom.xml 文件中添加以下依赖,然后点击 Maven 刷新,Maven 会从配置的远程仓库中自动下载并导入依赖包
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-cache</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.github.ben-manes.caffeine</groupId>
  7. <artifactId>caffeine</artifactId>
  8. <version>2.5.5</version>
  9. </dependency>
  1. .properties 配置文件中 加入以下配置,设置了缓存的类型以及自定义的缓存参数,比如过期时间
  1. spring.cache.type=caffeine
  2. spring.cache.caffeine.spec=initialCapacity=10,maximumSize=200,expireAfterWrite=30s
  1. 另外不要忘了在启动类上加开启缓存的注解

  1. 2.2.2 测试接口
  2. 因为 Caffeine 常用的注解有三个,所以这里三个测试接口分别测试每种注解的使用
  3. 第一个测试接口对应的是 @Cacheable 注解的使用,value 指明缓存的名称为 data , key 利用 Spring EL 表达式与请求参数中的 "s" 相关联,方法作用就是打印当前时间
  1. import org.springframework.cache.annotation.CacheEvict;
  2. import org.springframework.cache.annotation.CachePut;
  3. import org.springframework.cache.annotation.Cacheable;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import java.time.LocalDateTime;
  9. /**
  10. * @author HuangBen
  11. */
  12. @RestController
  13. @RequestMapping("/cache")
  14. public class CachController {
  15. @Cacheable(value = "data",key = "#s")
  16. @GetMapping("/get")
  17. public String getData(String s){
  18. LocalDateTime now = LocalDateTime.now();
  19. String time = now.toString();
  20. System.out.println("查询到数据:"+ time);
  21. return " 查询到数据 :" + time;
  22. }
  23. @CachePut(value = "data",key = "#s")
  24. @GetMapping("/put")
  25. public String putData(String s){
  26. LocalDateTime now = LocalDateTime.now();
  27. String time = now.toString();
  28. System.out.println("存储数据:"+ time);
  29. return " 存储数据 :" + time;
  30. }
  31. @CacheEvict(value = "data",key = "#s")
  32. @PostMapping("/rem")
  33. public String remData(String s){
  34. LocalDateTime now = LocalDateTime.now();
  35. String time = now.toString();
  36. System.out.println("清除数据 :"+time);
  37. return " 清除数据 :" + time;
  38. }
  39. }
2.3 接口测试
  1. 2.3.1 测试 @Cacheable 注解
  2. 通过模拟请求,可以看到成功创建缓存,并且在三十秒内重复请求的话,直接返回缓存中的数据并不会重新执行方法体,从控制台只打印了一条日志也可以体现

  1. ![](https://i-blog.csdnimg.cn/direct/1456766d0d484399a26403a4bddfdec1.png)
  2. 2.3.2 测试 @CachePut 注解
  3. @CachePut 注解的特性就是每次都进到方法体,然后执行结束后会进行缓存刷新,这一点可以从测试 @Cacheable 注解体现,执行完一次 cacheput 操作后,之前的接口返回的缓存也是 CachePut 接口产生的数据![](https://i-blog.csdnimg.cn/direct/3aa7f398499b4c608d75b51ff1f8e5fd.png)

  1. 2.3.3 测试 @CacheEvict 注解
  2. @CacheEvict 注解的主要作用是清除指定的缓存,通常用于删除数据的业务逻辑之后,一并清除缓存;这里可以通过控制台信息体现,先使用 Cacheput 操作产生缓存,然后调用 CacheEvict 清除缓存,再通过 Cacheable 操作查询缓存,结果显示并未查询到 CachePut 中产生的缓存数据![](https://i-blog.csdnimg.cn/direct/ca2d07c767b34c40a6e4a6ec37fcd33f.png)

💞️三、章末

  1. 文章到这里就结束了~


本文转载自: https://blog.csdn.net/TM007_/article/details/140403890
版权归原作者 先锋 Coder 所有, 如有侵权,请联系我们删除。

“【Caffeine】⭐️SpringBoot 项目整合 Caffeine 实现本地缓存”的评论:

还没有评论