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 的依赖)。

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

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 自动处理缓存的存取和失效操作。

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring CacheSpring框架提供的一种缓存机制,用于提高应用程序的性能和响应速度。通过使用Spring Cache,可以将方法的返回值缓存起来,当下次调用相同的方法时,可以直接从缓存中获取结果,而不需要再执行方法的逻辑。 在使用Spring Cache时,需要进行一些配置。首先,需要添加Redis的配置信息,包括缓存类型、缓存过期时间、缓存键的前缀等。可以通过设置`spring.cache.type`为`redis`来指定使用Redis作为缓存类型。可以使用`spring.cache.redis.time-to-live`设置缓存的过期时间,单位为毫秒。可以使用`spring.cache.redis.key-prefix`设置缓存键的前缀,如果不指定前缀,则默认使用缓存的名字作为前缀。可以使用`spring.cache.redis.use-key-prefix`设置是否使用前缀,默认为true。可以使用`spring.cache.redis.cache-null-values`设置是否缓存空值,以防止缓存穿透。 另外,Spring Cache还支持使用JCache(JSR-107)注解来简化开发。从Spring 3.1开始,定义了`org.springframework.cache.Cache`和`org.springframework.cache.CacheManager`接口来统一不同的缓存技术。 在使用Spring Cache时,可以通过在方法上添加`@Cacheable`注解来启用缓存功能。当调用带有`@Cacheable`注解的方法时,Spring会首先检查缓存中是否存在相应的结果,如果存在,则直接返回缓存中的结果,如果不存在,则执行方法的逻辑,并将结果存入缓存中。 总结起来,使用Spring Cache可以通过配置Redis等缓存信息,并在方法上添加`@Cacheable`注解来实现缓存功能,提高应用程序的性能和响应速度。 #### 引用[.reference_title] - *1* [SpringCache使用](https://blog.csdn.net/ABestRookie/article/details/121297482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [springcache使用详解(使用redis做分布式缓存)](https://blog.csdn.net/A_art_xiang/article/details/125580962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyt涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值