私のアプリケーションでは、24 時間ごとにキャッシュを更新する必要があるシナリオがあります。データベースのダウンタイムが予想されるため、データベースが稼働している場合にのみ、24 時間後にキャッシュを更新するユース ケースを実装する必要があります。
私はspring-ehacheを使用しており、24時間ごとに更新する単純なキャッシュを実装しましたが、データベースのダウンタイムで保持を可能にするために頭を悩ませることができません。
私のアプリケーションでは、24 時間ごとにキャッシュを更新する必要があるシナリオがあります。データベースのダウンタイムが予想されるため、データベースが稼働している場合にのみ、24 時間後にキャッシュを更新するユース ケースを実装する必要があります。
私はspring-ehacheを使用しており、24時間ごとに更新する単純なキャッシュを実装しましたが、データベースのダウンタイムで保持を可能にするために頭を悩ませることができません。
概念的には、スケジューリングとキャッシュの削除を 2 つのモジュールに分割し、特定の条件 (この場合、データベースのヘルスチェックが を返すtrue
) が満たされた場合にのみキャッシュをクリアすることができます。
SomeCachedService.java :
class SomeCachedService {
@Autowired
private YourDao dao;
@Cacheable("your-cache")
public YourData getData() {
return dao.queryForData();
}
@CacheEvict("your-cache")
public void evictCache() {
// no body needed
}
}
CacheMonitor.java
class CacheMonitor {
@Autowired
private SomeCachedService service;
@Autowired
private YourDao dao;
@Scheduled(fixedDelay = TimeUnit.DAYS.toMillis(1))
public conditionallyClearCache() {
if (dao.isDatabaseUp()) {
service.evictCache();
}
}
}
Ehcache では、カスタム エビクション アルゴリズムを作成することもできますが、この場合、ドキュメントはあまり役に立ちません。