2017-09-24 6 views
0

かなり頻繁にダウンする傾向のある情報を提供するために、私たちが依存するシステムがあります。現在、ヘイゼルキャストを使用して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

と同様の挙動何かをしたいです利用不可

答えて

0

ヘーゼルキャストにrefreshAfterWriteが必要な場合はtime-to-live-secondsです。

time-to-live-secondsは、map.put操作を行うときにのみ変更されるため、GuavaのrefreshAfterWrite設定と基本的に同じです。

ご覧ください。http://docs.hazelcast.org/docs/3.8.6/manual/html-single/index.html#map-eviction

また、あなたはおそらく満了後にキャッシュ内のデータをリフレッシュしたいです。その後、MapLoaderまたはインターフェイスを使用することができます。データの有効期限が切れたときに、次の呼び出しがあっMapLoader.load方法&をヒットします(http://docs.hazelcast.org/docs/3.8.6/manual/html-single/index.html#loading-and-storing-persistent-data

この方法で、あなたは任意のソースから新しいデータを取得する/確認することができます。

+0

time-to-live-secondsは、問題の説明の最初の文で説明したように、私が探しているものではありません。私はエントリーを盲目的に退去させたくありません。私は、新しいバージョンが利用可能な場合にのみそれらを置き換えることを望みます。 – Alexandru

+0

@Alexandru私はGuava CacheLoaderに似ていますが、より多くのオプションを持つ 'MapLoader'で私の答えを更新しました。 –

関連する問題