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.args0.id:#root.args0指的是方法中的第一个参数,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;
}
相关推荐
林森lsjs15 分钟前
队列 FIFO 原理 & 手撕两种队列实现(链表 + 循环数组)—数据结构陆
java·开发语言·数据结构·队列
lisin-lee-cooper1 小时前
简单聊聊 OpenFeign 框架源码
java·微服务
Buke..1 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法
风流 少年1 小时前
Spring AI 2.0:阿里云百炼平台(智能体应用)
redis·spring·阿里云
半生过往2 小时前
前端学 Java 课程笔记
java·前端·笔记
肠畔码农2 小时前
深度解密 Redis 分布式锁:从单机原子语义到集群架构博弈
redis·分布式·架构
mmsx2 小时前
基于 Android 的校园信息管理系统源码
android·java·okhttp
Buke..2 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(上):Frida 反调试绕过与 unidbg 调用
java·开发语言·爬虫·python·安卓
竹枝溪2 小时前
Tomcat与Servlet全套小白教程
java·servlet·tomcat·cookie·filter·session·listener
UseLessQQ3 小时前
云计算k8s集群部署
java·kubernetes·云计算