尝试使用@Scheduled 示例:
@Scheduled(fixedRate = ONE_DAY)
@CacheEvict(value = { CACHE_NAME })
public void clearCache() {
log.debug("Cache '{}' cleared.", CACHE);
}
您也可以在@Scheduled中使用cron表达式。
@EnableScheduling
。 - Drakes如果您在带有参数的方法上使用@Cacheable注释,则在@CacheEvict上永远不要忘记allEntries=true注释属性,否则您的调用将仅从缓存中删除您提供给clearCache() 方法的键参数,这意味着您将无法从缓存中删除任何内容。
@CacheEvict
无法工作,所以我直接使用了CacheManager
。foo
的缓存。class MyClass {
@Autowired CacheManager cacheManager;
@Cacheable(value = "foo")
public Int expensiveCalculation(String bar) {
...
}
@Scheduled(fixedRate = 60 * 1000);
public void clearCache() {
cacheManager.getCache("foo").clear();
}
}
clearCache
,这样 "foo" 就不会被硬编码了吗? - zygimantusCreate a class.
Use the below method inside the class.
class A
{
@Autowired CacheManager cacheManager;
@Scheduled(cron ="0 */3 * ? * *")
public void cacheEvictionScheduler()
{
logger.info("inside scheduler start");
//clearCache();
evictAllCaches();
logger.info("inside scheduler end");
}
public void evictAllCaches() {
logger.info("inside clearcache");
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}
}
@Component
class MyClass
{
@Autowired
MyClass proxiedThis; // store your component inside its Spring proxy.
// A cron expression to define every day at midnight
@Scheduled(cron ="0 0 * * *")
public void cacheEvictionScheduler()
{
proxiedThis.clearCache();
}
@CacheEvict(value = { CACHE_NAME })
public void clearCache()
{
// intentionally left blank. Or add some trace info.
}
}
@Scheduled
和@CacheEvict
可以一起使用。对于内部bean调用,您还可以使用applicationContext.getBean(MyClass.class).clearCache()
。 - sjngm@Scheduled
和@CacheEvict
已经存在一段时间了。如果不起作用,那么通常是来自另一个角落的某些其他副作用。你可以尝试使用一个非常简单的项目,并添加一个带有两个注释以及@EnableScheduling
和@EnableCaching
的方法。 - sjngm/*
* This clears the entire cache called "myCache" everyday,
* at 00.00 (am) in the time zone of the server.
*/
@Scheduled(cron = "0 0 0 * * ?")
@CacheEvict(value = "myCache", allEntries = true)
public void clearMyCache() {}
/*
* This clears the entire cache called "myCache" everyday,
* at 00.00 (am) in the time zone of the server.
*/
@Scheduled(cron = "0 0 0 * * ?")
@CacheEvict(value = "myCache", allEntries = true)
public void clearMyCache() {
// Add logic here
log.debug("Clearing myCache now");
}
CacheEvict会在您的代码运行后发生,仅当它不抛出任何异常时才会发生。您可以通过添加"beforeInvocation = true"来更改这一点,在这种情况下,它首先清除缓存,然后运行您的代码。
Spring缓存框架是事件驱动的,即只有在调用相应方法时才会触发@Cacheable
或@CacheEvict
。
但是,您可以利用底层缓存提供程序(请记住,Spring缓存框架仅是一个抽象,本身不提供缓存解决方案)来自行使缓存失效。例如,EhCache具有一个属性,即timeToLiveSeconds
,它规定了缓存保持活动状态的时间。但是,除非调用@Cacheable
注释的方法,否则这不会为您重新填充缓存。
因此,对于特定时间(如午夜)的缓存清除和重新填充,请考虑在Spring中实现后台scheduled service,以按需触发缓存清除和重新填充。预期行为不是开箱即用的。
希望这可以帮助您。
@CacheEvict(value = "movieList", allEntries = true)
@Scheduled(cron = "@midnight", zone = "UTC")
public void evictMoviesCache() {
// Nothing to do. Cache eviction schedule, you can optionally log here.
}
@CacheEvict(value = "movieList", allEntries = true)
@Scheduled(fixedDelay = 12, timeUnit = TimeUnit.HOURS)
public void evictMoviesCache() {
// Nothing to do. Cache eviction schedule, you can optionally log here.
}