Spring cache的使用

Spring Cache是Spring提供的一个缓存框架,基于AOP原理,实现了基于注解的缓存功能,只需要简单地加一个注解就能实现缓存功能,对业务代码的侵入性很小。

1. 常用的 Spring Cache 注解

  • @EnableCaching:开启缓存功能。
  • @Cacheable:将方法返回值缓存,适用于读取操作。
  • @CacheEvict:清除缓存,常用于删除或更新数据时。
  • @CachePut:每次调用方法时都将返回值缓存,适用于更新缓存。
  • @Caching:组合多个缓存注解,以便同时执行多个缓存操作。
  • @CacheConfig:用于配置类的统一缓存配置,如指定缓存的名称等。

2. Spring Cache 的使用

2.1 引入依赖

在使用 Spring Cache 之前,需要在项目的 pom.xml 中引入相关依赖(例如,使用 Redis 作为缓存时需引入 Spring Data Redis 的依赖)。


    org.springframework.boot
    spring-boot-starter-cache


    org.springframework.boot
    spring-boot-starter-data-redis

2.2 启用缓存功能

在 Spring Boot 应用的启动类上添加 @EnableCaching 注解,开启缓存支持。

@SpringBootApplication
@EnableCaching
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

2.3 配置缓存管理器

使用 Redis 作为缓存时,可以通过配置类来定义 CacheManager。例如:

@Configuration
public class CacheConfig {
    
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(60))  // 设置缓存有效期
            .disableCachingNullValues();  // 不缓存null值
        return RedisCacheManager.builder(redisConnectionFactory)
            .cacheDefaults(cacheConfiguration)
            .build();
    }
}

2.4 在业务方法中使用缓存注解

在业务逻辑中,通过注解来声明需要缓存的操作。

2.4.1 @Cacheable

适用于查询操作,若缓存中已有数据则返回缓存数据,若没有则执行方法并将结果缓存。

@Cacheable(value = "users", key = "#userId")
public User getUserById(String userId) {
    // 模拟从数据库获取用户信息
    return userRepository.findById(userId).orElse(null);
}

Cacheable注解配置的两项参数说明:

value:缓存的名称,缓存名称作为缓存key的前缀。

key: 缓存key,支持SpEL表达式,上述代码表示取参数id的值作为key

最终缓存key为:缓存名称+“::”+key,例如:上述代码id为123,最终的key为:JZ_CACHE:SERVE_RECORD::123

SpEL(Spring Expression Language)是一种在 Spring 框架中用于处理字符串表达式的强大工具,它可以实现获取对象的属性,调用对象的方法操作。

keyGenerator:指定一个自定义的键生成器(实现 org.springframework.cache.interceptor.KeyGenerator 接口的类),用于生成缓存的键。与 key 属性互斥,二者只能选其一。

cacheManager:表示缓存管理器,通过缓存管理器可以设置缓存过期时间。

2.4.2 @CacheEvict

适用于删除缓存操作。例如,当更新或删除某个数据时,清除相应的缓存。

@CacheEvict(value = "users", key = "#userId")
public void deleteUserById(String userId) {
    userRepository.deleteById(userId);
}

2.4.3 @CachePut

适用于更新缓存数据,每次调用方法时都将更新缓存

@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    return userRepository.save(user);
}

3. Spring Cache 的工作原理

3.1 基于 AOP

Spring Cache 是基于 Spring 的 AOP 原理实现的。在执行被缓存的方法之前,代理对象会先检查缓存中是否已经有数据,如果有则直接返回缓存数据,不再执行方法。

3.2 缓存存储和管理

如果缓存中没有数据,则调用实际方法执行,并将方法的返回值存储到缓存中,供下次调用时使用。

3.3 注解作用

通过注解(如 @Cacheable 等),开发者无需显式地编写缓存逻辑,Spring Cache 自动处理缓存的存取和失效操作。

你可能感兴趣的:(java,spring,java,后端,Spring,Cache,缓存,Cacheable,AOP)