spring boot cacheable在啥情况下不生效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot cacheable在啥情况下不生效相关的知识,希望对你有一定的参考价值。

1、功能使用注解实现,不能托管spring的地方,注解是无效的 需要注意
2、开启缓存 @EnableCaching

3、引用 jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
参考技术A @Cacheable(value="articleCache",key="#root.targetClass+#root.methodName")

Spring Boot - 如何在开发过程中禁用@Cacheable?

【中文标题】Spring Boot - 如何在开发过程中禁用@Cacheable?【英文标题】:Spring Boot - How to disable @Cacheable during development? 【发布时间】:2016-06-25 08:05:19 【问题描述】:

我正在寻找两件事:

    如何在开发过程中使用 Spring 引导“dev”配置文件禁用所有缓存。在 application.properties 中没有通用设置将其全部关闭。最简单的方法是什么?

    如何禁用特定方法的缓存?我尝试像这样使用 SpEl:

    @Cacheable(value = "complex-calc", condition="#$spring.profiles.active != 'dev'")
    public String someBigCalculation(String input)
       ...
    
    

但我可以让它工作。关于 SO 有几个与此相关的问题,但它们指的是 XML 配置或其他东西,但我使用的是 Spring Boot 1.3.3,它使用自动配置。

我不想让事情过于复杂。

【问题讨论】:

spring.cache.type=NONE 添加到您的application-dev.properties spring.cache.type=NONE 不会关闭缓存,它会阻止缓存内容。即它仍然为您的程序添加了 27 层 AOP/拦截器堆栈,只是它不进行缓存。这取决于他所说的“全部关闭”是什么意思。 【参考方案1】:

默认情况下会自动检测和配置缓存类型。但是,您可以通过将 spring.cache.type 添加到配置中来指定要使用的缓存类型。要禁用它,请将值设置为NONE

如果您想对特定配置文件执行此操作,请将其添加到该配置文件 application.properties 在这种情况下修改 application-dev.properties 并添加

spring.cache.type=NONE

这将禁用缓存。

【讨论】:

我使用 SpEl 的第二个问题呢?在开发过程中有一些我不想缓存的特定方法。 davidxxx 答案是最佳答案。它准确地解释了 Spring 的行为和好的解决方案。 对于特定情况,davidxxx 的答案没有回答在@Cacheable 中使用SpEL,davidxxx 的答案太宽泛了……@PaulNUK 的答案似乎明白这一点。 旁注:您可以将其放入您的application-junit 配置文件并在所有测试中使用@ActiveProfiles("junit")。这将停用任何测试的缓存,防止在测试运行之间保持状态(使用@Cachable 时您将拥有其他状态)。如果您想在一个显式测试中测试缓存,您可以如下注释测试类以仅在那里进行活动缓存:@TestPropertySource(properties = "spring.cache.type=")【参考方案2】:

David Newcomb comment 说实话:

spring.cache.type=NONE 不会关闭缓存,它会阻止某些事情 从被缓存。即它仍然增加了 27 层 AOP/拦截器 堆栈到您的程序,只是它不进行缓存。它 取决于他所说的“全部关闭”是什么意思。

使用此选项可能会加快应用程序的启动速度,但也可能会产生一些开销。

1)完全禁用Spring Cache功能

@EnableCaching 类移动到一个专用的配置类中,我们将用@Profile 包装它以启用它:

@Profile("!dev")
@EnableCaching
@Configuration
public class CachingConfiguration 

当然,如果您已经有一个为除dev 环境之外的所有环境启用的Configuration 类,只需重用它:

@Profile("!dev")
//... any other annotation 
@EnableCaching
@Configuration
public class NoDevConfiguration 

2) 使用假 (noop) 缓存管理器

在某些情况下,通过配置文件激活 @EnableCaching 是不够的,因为您的应用程序的某些类或某些 Spring 依赖项希望从 Spring 容器中检索实现 org.springframework.cache.CacheManager 接口的 bean。 在这种情况下,正确的方法是使用假实现,这将允许 Spring 解决所有依赖项,而 CacheManager 的实现是免费的。

我们可以通过使用@Bean@Profile 来实现它:

import org.springframework.cache.support.NoOpCacheManager; 

@Configuration
public class CacheManagerConfiguration 

    @Bean
    @Profile("!dev")
    public CacheManager getRealCacheManager() 
        return new CaffeineCacheManager(); 
        // or any other implementation
        // return new EhCacheCacheManager(); 
    

    @Bean
    @Profile("dev")
    public CacheManager getNoOpCacheManager() 
        return new NoOpCacheManager();
    

或者,如果它更合适,您可以添加 spring.cache.type=NONE 属性,该属性产生与 M. Deinum 答案中所写相同的结果。

【讨论】:

@Alexandar Petrov 感谢您的快速反馈。我不知道如何链接到评论,我已尽力修复。 选项2与指定spring.cache.type=NONE相同。 @M. Deinum 很可能。感谢您的反馈!【参考方案3】:

对于第二个问题,请执行以下操作:

编写一个方法来确定特定配置文件是否处于活动状态(环境是您注入的环境)

boolean isProfileActive(String profile)  
   return Arrays.asList(environment.getActiveProfiles()).contains(profile);

然后将其用于可缓存注释上的拼写条件

【讨论】:

以上是关于spring boot cacheable在啥情况下不生效的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot通过@Cacheable注解实现缓存功能 | Spring Boot 36

Spring Boot - 如何在开发过程中禁用@Cacheable?

@Cacheable使用spring缓存

Spring Boot缓存注解@Cacheable@CacheEvict@CachePut使用

Spring Boot Ehcache使用@Cacheable同key不同value是否能被缓存?

Spring Boot缓存注解介绍