我正在使用Spring缓存进行缓存。如何在没有Scheduled Job的情况下清除缓存?
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, "-"); } }
31moq8wy2#
您可以使用@CacheEvict注解在调用特定方法时从该高速缓存中删除条目。
@CacheEvict(cacheNames = "myCache", key="#id") public void clearCacheById(Long id) { //... }
您可以使用CacheManager接口来访问缓存并手动清除它。例如,您可以将以下代码添加到方法中:
@Autowired private CacheManager cacheManager; public void clearCache() { cacheManager.getCache("myCache"). clear(); }
hl0ma9xz3#
您始终可以手动清除Cache。例如,假设您有一个共享的分布式缓存解决方案(例如 Hazelcast 或 Redis),并且希望在Spring [ Boot ]应用程序关闭时清除特定的“命名”缓存。然后,你可以这样做:
Cache
@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,用于统一接口和使用不同的缓存提供程序,例如 Hazelcast 或 Redis(请参阅Sping Boot 文档中支持的缓存提供程序的完整列表)。因此,在使用Cache.clear()(Javadoc)时应该谨慎,因为这可能会产生许多重要的影响,这取决于所使用的缓存提供程序(再次,Hazelcast,Redis,其他)以及您正在使用的拓扑结构(嵌入式,客户端/服务器,多站点)以及其他因素。使用Cache.clear()时选择谨慎。最好设置过期和驱逐策略,这同样会因缓存提供程序而异。祝你好运!
application.properties
CacheManager
Cache.clear()
3条答案
按热度按时间67up9zun1#
如果你想清除缓存而不使用schedule来自动清除缓存。你可以尝试caffeine,你可以设置该高速缓存过期时间
31moq8wy2#
您可以使用@CacheEvict注解在调用特定方法时从该高速缓存中删除条目。
您可以使用CacheManager接口来访问缓存并手动清除它。例如,您可以将以下代码添加到方法中:
hl0ma9xz3#
您始终可以手动清除
Cache
。例如,假设您有一个共享的分布式缓存解决方案(例如 Hazelcast 或 Redis),并且希望在Spring [ Boot ]应用程序关闭时清除特定的“命名”缓存。
然后,你可以这样做:
当然,您可以从任何地方获取您想要清除的缓存的名称,例如Sping Boot
application.properties
,或者动态地,如果您的应用程序动态创建和使用缓存,无论如何。所涉及的主要API来自核心 Spring FrameworkCache Abstraction中的
CacheManager
接口(Javadoc)和Cache
接口(Javadoc)。然而,需要注意的是,Spring的Cache Abstraction是一个SPI和facade,用于统一接口和使用不同的缓存提供程序,例如 Hazelcast 或 Redis(请参阅Sping Boot 文档中支持的缓存提供程序的完整列表)。
因此,在使用
Cache.clear()
(Javadoc)时应该谨慎,因为这可能会产生许多重要的影响,这取决于所使用的缓存提供程序(再次,Hazelcast,Redis,其他)以及您正在使用的拓扑结构(嵌入式,客户端/服务器,多站点)以及其他因素。使用
Cache.clear()
时选择谨慎。最好设置过期和驱逐策略,这同样会因缓存提供程序而异。
祝你好运!