2016-12-20 17 views
0

私は次キャッシュの問題を抱えていますキー全体の代わりにキー複数CachePut操作

この結果の利点は明らかです。つまり、次の起動時にfetchRecords(overlappingRecordKeys)を実行すると、長時間実行されるバッチクエリには以前に含まれていなかったキーのみが含まれます。これは、List全体の平等性をテストすることで得られないメリットです。

これは、そのメカニズムとしてkeyGeneratorインターセプター経由では解決できないだけで私たちは、この問題を解決するための最善のアプローチは何の方法

の呼び出しごとに単一のキャッシュキーを返すことができるように?私は1

は(AOPなしで、上記のようにCachingAspect

// pseudo code 
@Aspect 
class CachingAspect { 

    CacheManager mgr = ... 

    @Around("somePointcut") 
    void checkCache(ProceedingPointCut pc) { 

    // grab args from 'pc' which is of type List<String> 
    // check against 'mgr', modify the argument to exclude those records already in cache 
    // capture the output (i.e. new records from long-running operation), append with records retrieved from cache, return the union 

    } 
} 

ソリューション2

同じ考えを作成し、直接fetchRecords()でコードを入れて2つのソリューション

策を考えることができます。これには利点があります追加された型の安全性を犠牲にして

どのソリューションが優れていますか?またはアプローチ?

答えて

0

バルク操作とスプリングキャッシュ抽象化についての質問が頻繁にポップアップします。これは適用されません。

...優雅

のコストでまあ、優雅は好みの問題です。

アノテーションなしのストレートな解決策であり、キャッシュローダーによる読込みスルー構成です。これは、AOPを介した優雅さと効率性の両方を重視している可能性があります。たとえば、JCache/JSR107互換のキャッシュでは、正確に求められるCache.getAll(keys)オペレーションが提供されます。

サイドノード:バルクリクエストの実行時に実際に何が起こるかは、キャッシュの実装によって異なりますが、それは簡単なことではありません。たとえば、1つのキーの値を複数回並列にフェッチしないようにキーごとにブロックする必要がある場合は、デッドロックに対しても保護する必要があります。

関連する問題