在应用启动时,我初始化了大约20个不同的缓存:
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(many many names));
return cacheManager;
}
我希望定时清除所有缓存,比如每个小时。使用一个预定任务:
@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()));
}
}
}
除非我误解了文档,但是@CacheEvict
需要我实际提供缓存的名称,这可能会很麻烦。
我该如何使用@CacheEvict
来清除所有缓存?
我在考虑,是否可以不使用@CacheEvict
,而是遍历所有缓存:
cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear());
@CacheEvict
,因为它并不是为此而设计的,但它仍然是一种hack方法,你应该使用适当的缓存技术。 - M. Deinum