如何在没有Scheduled annotation的情况下清除Spring Cache

dohp0rv5  于 2023-04-04  发布在  Spring
关注(0)|答案(3)|浏览(105)

我正在使用Spring缓存进行缓存。如何在没有Scheduled Job的情况下清除缓存?

67up9zun

67up9zun1#

如果你想清除缓存而不使用schedule来自动清除缓存。你可以尝试caffeine,你可以设置该高速缓存过期时间

@Configuration
@EnableCaching
public class CacheConfiguration {

    @Value("${application.cache.time-to-live:3600}")
    private int timeToLive;

    @Bean
    public Caffeine caffeineConfig() {
        return Caffeine.newBuilder().expireAfterWrite(timeToLive, TimeUnit.SECONDS);
    }

    @Bean
    public CacheManager cacheManager(Caffeine caffeine) {
        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
        caffeineCacheManager.setCaffeine(caffeine);
        return caffeineCacheManager;
    }

    @Bean("customKeyGenerator")
    public KeyGenerator keyGenerator() {
        return (target, method, params) -> StringUtils.arrayToDelimitedString(params, "-");
    }

}
31moq8wy

31moq8wy2#

您可以使用@CacheEvict注解在调用特定方法时从该高速缓存中删除条目。

@CacheEvict(cacheNames = "myCache", key="#id")
   public void clearCacheById(Long id) {
    //...
 }

您可以使用CacheManager接口来访问缓存并手动清除它。例如,您可以将以下代码添加到方法中:

@Autowired
private CacheManager cacheManager;

public void clearCache() {
 cacheManager.getCache("myCache"). 
     clear();
}
hl0ma9xz

hl0ma9xz3#

您始终可以手动清除Cache
例如,假设您有一个共享的分布式缓存解决方案(例如 HazelcastRedis),并且希望在Spring [ Boot ]应用程序关闭时清除特定的“命名”缓存。
然后,你可以这样做:

@SpringBootApplication
public class MyCachingSpringBootApplication { 

  public static void main(String[] args) {
    SpringApplication.run(MyCachingSpringBootApplication.class, args);
  }

  private static final Set<String> namedCachesToClear = 
    new HashSet<>(Arrays.asList("CacheOne", "CacheTwo"));

  @Autowired
  private final CacheManager cacheManager;

  @EventListener
  public void clearTargetCaches(ApplicationClosedEvent event) {
  

    this.cacheManager.getCacheNames().stream()
      .filter(namedCachesToClear::contains)
      .map(cacheName -> this.cacheManager.getCache(cacheName))
      .filter(Objects::nonNull)
      .forEach(Cache::clear);
  }
}

当然,您可以从任何地方获取您想要清除的缓存的名称,例如Sping Boot application.properties,或者动态地,如果您的应用程序动态创建和使用缓存,无论如何。
所涉及的主要API来自核心 Spring FrameworkCache Abstraction中的CacheManager接口(Javadoc)和Cache接口(Javadoc)。
然而,需要注意的是,Spring的Cache Abstraction是一个SPI和facade,用于统一接口和使用不同的缓存提供程序,例如 HazelcastRedis(请参阅Sping Boot 文档中支持的缓存提供程序的完整列表)。
因此,在使用Cache.clear()(Javadoc)时应该谨慎,因为这可能会产生许多重要的影响,这取决于所使用的缓存提供程序(再次,HazelcastRedis,其他)以及您正在使用的拓扑结构(嵌入式,客户端/服务器,多站点)以及其他因素。
使用Cache.clear()时选择谨慎。
最好设置过期和驱逐策略,这同样会因缓存提供程序而异。
祝你好运!

相关问题