Spring Cache + Springboot的配置

本文详细介绍了如何在Spring Boot应用中配置和使用缓存,包括基于注解的缓存管理,如@Cacheable、@CachePut和@CacheEvict的使用,以及自定义缓存和配置文件的相关设置。此外,还提到了缓存同步和条件,以及启用缓存的@EnableCaching注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存Cache

Cache与Buffer的区别

buffer:通常在快与慢的实体之间充当临时数据存储媒介。buffer中的数据仅经过(读写)一次buffer(即数据为可消费的)。此外,buffer至少对一方是可见的。

cache:cache是不可见到的,没有一方意识到cache发生。允许相同的数据多次被读取。

 


基于注解

@Cacheable

@Cacheable用于标识方法是可缓存的,被标识的方法将结果存储在缓存中,当再次执行时如果缓存内已经有值了,则直接放回无需执行方法。

 

  @Cacheable("books")  // 不加name的话,默认为cacheNames,指定缓存名字
  public Book findBook(ISBN isbn) {...}
  ​
  @Cacheable({"books", "isbns"})  // 可指定多个缓存
  public Book findBook(ISBN isbn) {...}

 

默认Key生成策略

缓存是通过键值对的方式来存储,所以需要对应的key才能读取数据。

 

KeyGenerator【spring4.0之后有变】

  • 没有参数 ☞ SimpleKey.EMPTY

  • 一个参数 ☞ 参数instance

  • 多个参数 ☞ 包含所有参数的SimpleKey

 

如果想自定义默认的key生成器则需要实现org.springframework.cache.interceptor.KeyGenerator接口

  @Cacheable(cacheNames="books", key="#isbn")
  public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed){}
  ​
  @Cacheable(cacheNames="books", key="#isbn.rawNumber")
  public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed){}
  ​
  @Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")
  public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed){}
  ​
  @Cacheable(cacheNames="books", keyGenerator="myKeyGenerator")  // 指定自定义的
<think>嗯,用户问的是Spring Cache整合Spring Boot,我需要详细介绍一下。首先,我应该回忆一下Spring Cache的作用,它是用来做方法级别的缓存,减少重复计算,提升性能。然后整合Spring Boot的话,通常Spring Boot有自动配置,所以可能步骤比较简单。 首先,可能需要添加相关的依赖,比如spring-boot-starter-cache,对吧?然后启用缓存,用@EnableCaching注解。接下来是配置缓存管理器,可能默认用的是ConcurrentMapCache,但实际项目可能用Redis或者Ehcache之类的,所以需要提到不同的缓存管理器配置。 然后,要介绍常用的注解,比如@Cacheable、@CachePut、@CacheEvict,这些是核心注解,分别用于缓存结果、更新缓存和清除缓存。要举例子说明怎么在方法上使用这些注解,参数怎么设置,比如key的生成策略,condition条件等。 另外,用户可能想知道如何选择缓存提供商,比如用Redis的话需要添加依赖,配置连接信息。可能需要分步骤说明,比如添加依赖,配置文件,然后使用@Cacheable等。也可能需要提到缓存的一些高级特性,比如过期时间,不过这可能取决于具体的缓存实现,比如在Redis配置过期时间。 还要注意可能遇到的问题,比如缓存穿透、雪崩,以及如何解决,或者配置不同的缓存策略。不过用户可能只需要基础整合步骤,所以先重点讲整合流程,再提一下扩展部分。 需要检查是否有遗漏的步骤,比如是否需要在application.properties里配置一些属性,比如spring.cache.type来指定缓存类型。或者缓存的名称配置,比如spring.cache.cache-names。 可能用户是刚开始用,所以例子要简单明了,比如一个Service类,用@Cacheable来缓存方法结果。测试的时候,多次调用看是否只执行一次方法体。 总结下来,回答的结构应该是:介绍Spring Cache的作用,整合Spring Boot的步骤(依赖、启用、配置、使用注解),然后示例代码,最后可能提到其他缓存提供器的切换方式。这样用户能有一个清晰的流程去实现整合。</think>Spring CacheSpring 框架提供的缓存抽象层,用于简化缓存操作,而 Spring Boot 通过自动配置进一步简化了与 Spring Cache 的整合。以下是整合 Spring CacheSpring Boot 的核心步骤和关键点: --- ### **1. 添加依赖** 在 `pom.xml` 中引入 Spring Boot Cache 模块: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ``` 若需使用 Redis、Ehcache 等具体缓存实现,需额外添加对应依赖(例如 Redis): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` --- ### **2. 启用缓存** 在启动类或配置类上添加 `@EnableCaching` 注解,开启缓存功能: ```java @SpringBootApplication @EnableCaching public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` --- ### **3. 配置缓存实现** 在 `application.properties` 或 `application.yml` 中配置缓存类型(默认使用 Simple Cache): ```properties # 指定缓存类型(如 redis、ehcache、caffeine 等) spring.cache.type=redis # 若使用 Redis,需配置连接信息 spring.redis.host=localhost spring.redis.port=6379 ``` --- ### **4. 核心注解使用** Spring Cache 通过注解驱动缓存操作,常用注解如下: #### **@Cacheable** - **作用**:将方法返回值缓存,后续相同参数直接返回缓存值。 - **示例**: ```java @Cacheable(value = "users", key = "#id") public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } ``` #### **@CachePut** - **作用**:更新缓存,始终执行方法体并缓存结果。 - **示例**: ```java @CachePut(value = "users", key = "#user.id") public User updateUser(User user) { return userRepository.save(user); } ``` #### **@CacheEvict** - **作用**:删除缓存,常用于数据变更后清理缓存。 - **示例**: ```java @CacheEvict(value = "users", key = "#id") public void deleteUser(Long id) { userRepository.deleteById(id); } ``` #### **@Caching** - **作用**:组合多个缓存操作。 - **示例**: ```java @Caching( evict = {@CacheEvict(value = "users", key = "#user.id")}, put = {@CachePut(value = "userDetails", key = "#user.id")} ) public void updateUserDetails(User user) { // ... } ``` --- ### **5. 缓存管理器配置** Spring Boot 默认根据依赖自动配置 `CacheManager`,例如: - **Simple Cache**:基于内存的 `ConcurrentMap`(默认)。 - **Redis**:使用 `RedisCacheManager`,需配置 `RedisConnectionFactory`。 - **Caffeine/Ehcache**:需添加对应依赖并配置 `ehcache.xml` 或参数。 --- ### **6. 自定义缓存配置** 可通过实现 `CacheManagerCustomizer` 或定义 `@Bean` 自定义缓存行为: ```java @Bean public CacheManagerCustomizer<RedisCacheManager> cacheManagerCustomizer() { return (cacheManager) -> { cacheManager.setDefaultCacheConfiguration( RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(10)) // 设置默认过期时间 ); }; } ``` --- ### **7. 缓存键生成策略** 默认使用方法参数生成缓存键,可通过 `keyGenerator` 自定义: ```java @Bean public KeyGenerator customKeyGenerator() { return (target, method, params) -> { return method.getName() + "_" + Arrays.toString(params); }; } ``` --- ### **总结** Spring Boot 整合 Spring Cache 的核心步骤: 1. 添加依赖,选择缓存实现(如 Redis)。 2. 启用 `@EnableCaching`。 3. 通过注解(如 `@Cacheable`)标记缓存操作。 4. 按需配置缓存参数或自定义 `CacheManager`。 通过这种整合,可以快速实现方法级缓存,显著提升应用性能,同时保持代码简洁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值