0

次のような EHCache インスタンスを作成しています。

CacheManager cacheMgr = CacheManager.getInstance();
cacheMgr.setName("myCache");

CacheConfiguration cacheConfig = new CacheConfiguration(getCacheName(), 1)                  
                    .eternal(true)
                    .overflowToOffHeap(false)
                    .timeToLiveSeconds(0)
                    .maxEntriesLocalHeap(1)
                    .timeToIdleSeconds(0) .diskExpiryThreadIntervalSeconds(0);

Cache merchantCache = new Cache(cacheConfig);
cacheMgr.addCache(merchantCache);

merchantCache.put(new Element("key", "value"));
merchantCache.put(new Element("key1", "value"));
merchantCache.put(new Element("key2", "value"));

このコードを実行しても、例外は発生しません。= 1 でキャッシュを作成したのでmaxEntriesLocalHeap、そこに 3 つの要素を配置したため、例外が発生することを期待していました。

誰かが私が間違っていることを教えてもらえますか?

ありがとう

4

2 に答える 2

0

あなたは何も悪いことをしていません... http://ehcache.org/documentation/user-guide/storage-options#memory-use-spooling-and-expiry-strategyに記載されているメモリ削除ポリシーを確認してください。

デフォルトでは (memoryStoreEvictionPolicy が指定されていない場合)、LRU (最近使用されたもの) ポリシーが使用されます...つまり、キャッシュにスペースがなくなると、最も古いヒット要素が削除され、新しい要素のためのスペースが確保されます。をキャッシュに入れようとしています。

したがって、特定のテスト/コードでは、最後にキャッシュにあるキーは、削除ポリシーごとに「key2」である可能性があります...「key1」を入力すると「key」が削除され、「key1」を入力すると「key1」が削除されましたキー2」。

率直に言って、キャッシュ エントリを自然にリサイクルさせるのではなく、そのようにハード リミットを設定する必要がある理由がわかりません (おそらく、エビクション ポリシーを変更して LFU - 最後に頻繁に使用される - を使用するようにします)。メモリ内のキャッシュ エントリのホットセット...

BigMemory Max ( http://terracotta.org/products/bigmemorymax ) でクラスター化されたキャッシュを使用していた場合、「maxEntriesInCache」を使用してハード リミットを設定できます (これはクラスター化されたキャッシュに対してのみ有効です)。

于 2013-08-14T17:09:06.140 に答える