Spring Cache-基于注解的缓存

Spring Cache 是 Spring 提供的缓存抽象框架,能够将数据缓存到内存或外部缓存中,减少数据库或远程服务的访问频率,从而显著提升应用性能。Spring Cache 通过注解的方式实现缓存逻辑,使用方便,支持多种缓存实现,例如 ConcurrentMapEhCacheRedis 等。

1. Spring Cache 介绍

1.1 简介

Spring Cache 的核心是缓存抽象,通过注解方式自动管理缓存内容。Spring Cache 的特点包括:

  1. 缓存抽象:Spring Cache 提供了统一的缓存 API,可以通过不同的缓存实现(如 Redis、EhCache)来存储数据。
  2. 简洁易用:只需简单的注解,开发者可以在业务逻辑代码中实现缓存。
  3. 支持多种缓存策略:支持多种缓存策略如自动刷新、过期、更新等,适合多种业务场景。
  4. 可扩展性:Spring Cache 支持多种第三方缓存库,允许在项目需求变化时灵活选择缓存策略。

1.2 依赖

java 复制代码
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2. 常用注解

Spring Cache 提供了丰富的注解来控制缓存的不同操作,以下是常用的注解:

在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。

例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。

2.1 @EnableCaching

@EnableCaching 是 Spring Cache 的入口注解,用于启用 Spring 的缓存功能。这个注解通常加在 Spring Boot 启动类上。

java 复制代码
@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2.2 @Cacheable

在方法执行前,spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中

  • 作用:将方法的返回结果进行缓存,以便下次使用相同参数调用时直接从缓存中获取。
  • 属性
    • value:指定缓存的名称。
    • key:缓存的键(可用 SpEL 表达式定义)。
    • condition:缓存条件,满足条件时才进行缓存。
java 复制代码
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    // 从数据库获取用户信息
}

2.3 @CachePut

  • 作用:更新缓存,但不影响方法的正常调用。常用于修改或新增方法,保证缓存中的数据与数据库一致。
  • 属性
    • valuekey:同 @Cacheable,指定缓存的名称和键。
    • condition:缓存条件,满足条件时才进行缓存。
java 复制代码
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    // 更新数据库中的用户信息
    return user;
}

**说明:**key的写法如下

#user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;

#result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;

#p0.id:#p0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;

#a0.id:#a0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;

#root.args[0].id:#root.args[0]指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数

的id属性作为key ;

2.4 @CacheEvict

  • 作用:清除缓存,通常用于删除操作。
  • 属性
    • valuekey:指定缓存的名称和键。
    • allEntries:是否清除所有缓存内容,默认为 false。设置为 true 时会清除指定 value 中的所有缓存。
    • beforeInvocation:是否在方法调用前清除缓存,默认为 false(即方法执行后清除缓存)。
java 复制代码
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
    // 删除数据库中的用户信息
}

2.5 @Caching

当一个方法需要同时具备多种缓存操作时,可以用 @Caching 组合多个缓存注解。

java 复制代码
@Caching(
    put = { @CachePut(value = "users", key = "#user.id") },
    evict = { @CacheEvict(value = "usernames", key = "#user.username") }
)
public User updateUser(User user) {
    // 更新用户信息
    return user;
}
相关推荐
夜斗小神社8 分钟前
【黑马点评】(二)缓存
缓存
GJCTYU9 分钟前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
艾迪的技术之路19 分钟前
redisson使用lock导致死锁问题
java·后端·面试
今天背单词了吗98037 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师40 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构1 小时前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式