SpringBoot3.4.3基于Caffeine实现本地缓存
SpringBoot3.4.3基于Caffeine实现本地缓存

本专栏前一篇文章SpringBoot3.4.3集成Knife4j实现接口文档管理和调试。今天分享SpringBoot3.4.3基于Caffeine实现本地缓存,开发者为了提高应用程序性能缓存的应用是最常见的技术手段之一。
完整代码在文章最后,如果觉得本篇文章对你有用,记得点赞、关注、收藏哦。你的支持是我持续更新的动力!
文章最后可以加入免费的Java&AI技术和支付系统沟通社群,一起探讨Java/你的产品如何与AI结合,请按照要求加入。在群中可以聊开发、系统设计、架构、行业趋势、AI等等话题
SpringBoot3专栏软件环境
- JDK17.0.12
- SpringBoot3.4.3
- IDEA2024.3.3
- Caffeine3.2.0
我们先看本篇文章对应的项目结构,请看下图

1 什么是Caffeine
Caffeine 是一个基于 Java 8 开发的高性能、接近最优的缓存库,在 Java 应用程序中被广泛使用。以下详细介绍它的用途及特点
Github https://github.com/ben-manes/caffeine
1.1 用途
- 减少数据库压力:在高并发的应用场景中,频繁的数据库查询操作会给数据库带来较大压力。使用 Caffeine 作为本地缓存,可以将经常访问的数据存储在内存中,当有相同的数据请求时,直接从缓存中获取,避免了重复的数据库查询,从而减轻数据库的负担。例如,在交易型系统中,商品的基本信息(如名称、价格等)可能会被频繁访问,将这些信息缓存在 Caffeine 中,可以显著提高系统的响应速度。
- 提高系统性能:由于内存的访问速度远远快于磁盘或网络的访问速度,将数据存储在 Caffeine 缓存中可以大大减少数据的获取时间,提高系统的整体性能。特别是对于一些计算成本较高的操作,如复杂的业务逻辑计算、大数据量的统计分析等,将计算结果缓存起来,下次需要时直接从缓存中获取,避免了重复计算,提高了系统的响应速度。
- 缓存频繁访问的数据:对于一些经常被访问但更新频率较低的数据,如配置信息、字典数据等,使用 Caffeine 缓存可以提高数据的访问效率。例如,在一个多租户的应用系统中,每个租户的配置信息可能在一段时间内不会发生变化,将这些配置信息缓存起来,可以减少每次请求时读取配置文件或数据库的开销。
1.2 特点
- 高性能:Caffeine 使用了多种优化技术,如使用了
ConcurrentHashMap
作为底层数据结构,结合了多种并发控制机制,使得在多线程环境下能够高效地进行缓存的读写操作。同时,它还采用了 Window TinyLfu 算法来管理缓存的淘汰策略,该算法能够更准确地预测数据的访问频率,从而在有限的缓存空间内保留最有价值的数据,提高缓存的命中率。 - 灵活的配置选项:Caffeine 提供了丰富的配置选项,可以根据不同的应用场景进行灵活配置。例如,可以设置缓存的初始容量、最大容量、过期策略(如基于时间的过期、基于访问次数的过期等)、缓存刷新策略等。
2 Caffeine常用注解
2.1 @Cacheable
作用:
@Cacheable
注解用于标记一个方法的返回值可以被缓存。当调用这个方法时,Spring 会先检查缓存中是否已经存在对应的值,如果存在则直接从缓存中获取,不再执行方法体;如果不存在,则执行方法体并将返回值存入缓存。常用属性
value
:指定缓存的名称,必选属性。key
:指定缓存的键,支持 SpEL 表达式。默认使用方法的参数作为键。condition
:指定缓存的条件,只有满足该条件时才会进行缓存操作,支持 SpEL 表达式。unless
:指定不进行缓存的条件,当满足该条件时,即使方法执行完成也不会将结果存入缓存,支持 SpEL 表达式。使用场景:适用于查询操作,尤其是那些频繁查询且数据更新不频繁的场景。
2.2 @CachePut
- 作用:
@CachePut
注解用于更新缓存中的数据。无论缓存中是否已经存在对应的值,都会执行方法体,并将方法的返回值更新到缓存中。 - 常用属性:与
@Cacheable
类似,包括value
、key
、condition
、unless
等。 - 使用场景:适用于更新操作,当对数据进行更新时,同时更新缓存中的数据。
2.3 @CacheEvict
作用:
@CacheEvict
注解用于清除缓存中的数据。可以指定清除单个缓存项或整个缓存。常用属性:
value
:指定要清除的缓存名称,必选属性。
key
:指定要清除的缓存项的键,支持 SpEL 表达式。如果不指定key
,则会清除整个缓存。
allEntries
:布尔类型,默认为false
。如果设置为true
,则会清除指定缓存中的所有条目。
beforeInvocation
:布尔类型,默认为false
。如果设置为true
,则在方法执行之前清除缓存;否则,在方法执行成功后清除缓存。使用场景:适用于删除操作,当删除数据时,同时清除缓存中的对应数据。
2.4 @Caching
- 作用:
@Caching
注解用于组合多个缓存注解。当一个方法需要同时使用多个不同的缓存操作时,可以使用@Caching
注解。 - 常用属性:
@Caching
注解包含cacheable
、put
、evict
三个属性,分别用于指定多个@Cacheable
、@CachePut
、@CacheEvict
注解。 - 使用场景:当一个方法需要同时进行多种缓存操作时,例如在更新数据时,既要更新某个缓存项,又要清除另一个缓存中的所有数据。
3 项目实战
3.1 pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.itbeien</groupId>
<artifactId>springboot3-labs-master</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>springboot-caffeine</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<caffeine-version>3.2.0</caffeine-version>
<mysql-connector-java-version>8.0.33</mysql-connector-java-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<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>${caffeine-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
3.2 配置信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.0.103:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#spring.sql.init.schema-locations=classpath:db/schema-mysql.sql
#spring.sql.init.data-locations=classpath:db/data-mysql.sql
spring.sql.init.mode=always
logging.level.cn.itbeien.mybatis.plus=debug
# MyBatis配置
# 搜索指定包别名
mybatis.typeAliasesPackage=cn.itbeien.**.entity
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mybatis.mapperLocations=classpath*:mapper/**/*Mapper.xml
3.3 代码实现
package cn.itbeien.caffeine.service;
import cn.itbeien.caffeine.dao.SysUserMapper;
import cn.itbeien.caffeine.entity.SysUser;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
/**
* @author itbeien
* 项目网站:https://www.itbeien.cn
* 公众号:贝恩聊架构
* 全网同名,欢迎小伙伴们关注
* Java/AI学习社群
* Copyright© 2025 itbeien
*/
@Component
@Slf4j
public class CacheService {
@Resource
private SysUserMapper sysUserMapper;
// 使用@Cacheable注解,表示该方法的结果会被缓存
@Cacheable(value = "user", key = "#p0",unless = "#result == null")
public SysUser getUserById(Long id) {
// 从数据库获取数据
log.info("Fetching data from database for id:{} " , id);
SysUser sysUser = sysUserMapper.selectByPrimaryKey(id);
return sysUser;
}
// 使用@CachePut注解,表示该方法的结果会被更新到缓存中
@CachePut(value = "user", key = "#p0")
public SysUser updateUserById(SysUser sysUser) {
// 更新数据库中的数据
log.info("Updating data in database for id: {}" , sysUser.getId());
this.sysUserMapper.updateByPrimaryKey(sysUser);
return sysUser;
}
// 使用@CacheEvict注解,表示该方法会从缓存中删除对应的数据
@CacheEvict(value = "user", key = "#p0")
public void deleteUserById(Long id) {
// 从数据库中删除数据
log.info("Deleting data from database for id: {}" , id);
this.sysUserMapper.deleteByPrimaryKey(id);
}
}
4 单元测试
打开浏览器进行本地缓存测试,下图为第一次和第二次执行查询,控制台打印的日志信息

以上就是今天SpringBoot3.4.3基于Caffeine实现本地缓存全部内容,文章最后有源码下载地址
欢迎大家关注我的项目实战内容itbeien.cn,一起学习一起进步,在项目和业务中理解各种技术。

欢迎沟通交流技术和支付业务,一起探讨聚合支付/预付卡系统业务、技术、系统架构、微服务、容器化。并结合聚合支付系统深入技术框架/微服务原理及分布式事务原理。加入我的知识星球吧

AI专栏
01IDEA&VsCode集成DeepSeek-V3 API提高编程效率
02IntelliJ IDEA集成主流 AI 编程助手及特性介绍
03Spring AI快速入门-基于DeepSeek&智谱实现聊天应用
04Spring AI中流式对话API如何使用-基于DeepSeek
06SpringAI实现角色扮演(自定义人设)和Prompts模板语法-基于DeepSeek
07LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI
SpringBoot3专栏
01SpringBoot3专栏-SpringBoot3.4.0整合Mybatis-plus和Mybatis
02SpringBoot3.4.0结合Mybatis-plus实现动态数据源
03mapstruct对象映射在Springboot3中这样用就对了
04RocketMQ5.3.1集成SpringBoot3.4.0就这样简单
05SpringBoot3.4.0整合Redisson实现分布式锁
06MySQL增量数据同步利器Canal1.1.7环境搭建流程
07SpringBoot3.4.0集成Canal1.1.7实现MySQL实时同步数据到Redis
08基于Docker-SpringBoot3.4.0集成Apache Pulsar4.0.1实现消息发布和订阅
09SpringBoot3.4.0整合消息中间件Kafka和RabbitMQ
10SpringBoot3.4.0整合ActiveMQ6.1.4
11SpringBoot3整合Spring Security6.4.2 安全认证框架实现简单身份认证
12SpringBoot3.4.1和Spring Security6.4.2实现基于内存和MySQL的用户认证
13SpringBoot3.4.1和Spring Security6.4.2结合OAuth2实现GitHub授权登录
14SpringBoot3.4.1和Spring Security6.4.2结合JWT实现用户登录
16SpringBoot3.4.1基于MySQL8和Quartz实现定时任务管理
17SpringBoot3.4.2基于MyBatis和MySQL8多数据源使用示例
18SpringBoot3.4.3实现(文本/附件/HTML/图片)类型邮件发送案例
19SpringBoot3.4.3实现文件上传和全局异常处理
20SpringBoot3.4.3集成Knife4j实现接口文档管理和调试
跟着我学微服务系列
01跟着我学微服务,什么是微服务?微服务有哪些主流解决方案?
05SpringCloudAlibaba之图文搞懂微服务核心组件在企业级支付系统中的应用
06JDK17+SpringBoot3.4.0+Netty4.1.115搭建企业级支付系统POS网关
07JDK17+SpringCloud2023.0.3搭建企业级支付系统-预付卡支付交易微服务
08JDK17+Dubbo3.3.2搭建企业级支付系统-预付卡支付交易微服务
09JDK17+SpringBoot3.3.6+Netty4.1.115实现企业级支付系统POS网关签到功能
贝恩聊架构-项目实战地址
欢迎大家一起讨论学习,加我备注"Java/AI"拉你进入Java&AI技术讨论群,备注"聚合支付"拉你进入支付系统讨论群,在技术学习、成长、工作的路上不迷路!加我后不要急,每天下午6点左右通过!营销号免入

5 源码地址
贝恩聊架构-SpringBoot3专栏系列文章、资料和源代码会同步到以下地址,代码和资料每周都会同步更新
该仓库地址主要用于存放贝恩聊架构-SpringBoot3专栏、贝恩聊架构-AI专栏、基于企业级支付系统学习微服务整体技术栈所有资料和源码
