如何在Spring Boot中逐出所有缓存?

iCo*_*unk 15 java caching spring-boot

在应用程序启动时,我初始化了大约20个不同的缓存:

@Bean
public CacheManager cacheManager() {
    SimpleCacheManager cacheManager = new SimpleCacheManager();
    cacheManager.setCaches(Arrays.asList(many many names));
    return cacheManager;
}
Run Code Online (Sandbox Code Playgroud)

我想以一个间隔重置所有缓存,比如说每小时.使用计划任务:

@Component
public class ClearCacheTask {

    private static final Logger logger = LoggerFactory.getLogger(ClearCacheTask.class);
    private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");

    @Value("${clear.all.cache.flag}")
    private String clearAllCache;

    private CacheManager cacheManager;

    @CacheEvict(allEntries = true, value="...............")
    @Scheduled(fixedRate = 3600000, initialDelay = 3600000) // reset cache every hr, with delay of 1hr
    public void reportCurrentTime() {
        if (Boolean.valueOf(clearAllCache)) {
            logger.info("Clearing all cache, time: " + formatter.print(DateTime.now()));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除非我正在阅读文档错误,但 @CacheEvict要求我实际提供缓存的名称,这可能会变得混乱.

我如何使用 @CacheEvict清除所有缓存?

我在思考而不是使用 @CacheEvict,我只是循环遍历所有缓存:

cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear());
Run Code Online (Sandbox Code Playgroud)

iCo*_*unk 42

我刚使用计划任务使用缓存管理器清除所有缓存.

@Component
public class ClearCacheTask {
    @Autowired
    private CacheManager cacheManager;

    @Scheduled(fixedRateString = "${clear.all.cache.fixed.rate}", initialDelayString = "${clear.all.cache.init.delay}") // reset cache every hr, with delay of 1hr after app start
    public void reportCurrentTime() {
        cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear());
    }
}
Run Code Online (Sandbox Code Playgroud)

完成工作.

  • 对于使用 spring boot 进行调度的所有新手:不要忘记将 `@EnableScheduling` 注释添加到你的 spring boot 应用程序类中。(您应该已经有了`@SpringBootApplication` 和`@EnableCaching` 注释。) (5认同)