かなり頻繁にダウンする傾向のある情報を提供するために、私たちが依存するシステムがあります。現在、ヘイゼルキャストを使用して1時間の有効期限ポリシーでエントリをキャッシュしています。しかしながら、これは、キャッシュエントリが盲目的に追い出されるという問題を有しているので、システムが利用できない場合、要求はしばらく失敗する。Spring Cacheインターセプタ
私は緩く、私は、私は基本的に
Object valueFromCache = cache.getValue(cacheKey);
if (null == valueFromCache) {
valueFromCache = cachedMethod.invokeMethod();
cache.putValue(cacheKey, valueFromCache);
} else if (isValueExpired(valueFromCache)) {
try {
valueFromCache = cacheMethod.invokeMethod();
cache.putValue(cacheKey, valueFromCache);
} catch (FailedToRefreshDataException ex) {
doWhateverWithException(ex);
}
}
return valueFromCache;
に
Object valueFromCache = cache.getValue(cacheKey);
if (null == valueFromCache) {
valueFromCache = cachedMethod.invokeMethod();
cache.putValue(cacheKey, valueFromCache);
}
return valueFromCache;
から内部のスプリングの呼び出しを変更しようとしているに言えば、ロジックを追加するために、スプリングのキャッシュを傍受する方法を探しています基になるキャッシュ・プロバイダ(私の場合はヘイルキャスト)がエントリーを退去させる時期を決定するのではなく、より新しい値が取得された場合にのみ適用するようにします。
高可用性を得るために、わずかに古くなったデータを持つリスクに対処できます。
EDIT: 私は 'リファレンス・システムは' でしたので
public static void main(String[] args) throws ExecutionException, InterruptedException {
AtomicInteger atomicInteger = new AtomicInteger();
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.refreshAfterWrite(100, MILLISECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String value) throws Exception {
int intValue = atomicInteger.incrementAndGet();
if (intValue % 2 == 0) {
throw new IllegalStateException("Failed to whatever");
}
return value + intValue;
}
});
for (int i = 0; i < 10; i++) {
System.out.println("Attempt " + i + "=" + cache.get("Shoes"));
Thread.sleep(50);
}
}
出力
Attempt 0=Shoes1
Attempt 1=Shoes1
Attempt 2=Shoes1
Attempt 3=Shoes3
Attempt 4=Shoes3
Attempt 5=Shoes3
Attempt 6=Shoes5
Attempt 7=Shoes5
Attempt 8=Shoes5
Attempt 9=Shoes7
ませキャッシュが失敗したフェッチたとえばグアバcachebuilderのrefreshAfterWrite
と同様の挙動何かをしたいです利用不可
time-to-live-secondsは、問題の説明の最初の文で説明したように、私が探しているものではありません。私はエントリーを盲目的に退去させたくありません。私は、新しいバージョンが利用可能な場合にのみそれらを置き換えることを望みます。 – Alexandru
@Alexandru私はGuava CacheLoaderに似ていますが、より多くのオプションを持つ 'MapLoader'で私の答えを更新しました。 –