在EHCache中,如何防止将元素添加到缓存中?

时间:2013-08-14 11:42:53

标签: java ehcache

我正在创建一个像这样的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"));

运行此代码,我没有任何异常。因为我使用maxEntriesLocalHeap = 1创建了缓存,所以我希望得到一个例外,因为我在那里放了三个元素。

有谁能让我知道我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

我认为您需要使用maxEntriesInCache代替maxEntriesLocalHeap,因为:http://ehcache.org/apidocs/net/sf/ehcache/config/CacheConfiguration.html#maxEntriesInCache

编辑:对于非群集的ehcache,请使用:maxElementsInMemory

答案 1 :(得分:0)

你没有做错任何事情......请检查以下所述的记忆驱逐政策: http://ehcache.org/documentation/user-guide/storage-options#memory-use-spooling-and-expiry-strategy

默认情况下(如果未指定memoryStoreEvictionPolicy),使用LRU(最近使用的)策略...意味着如果缓存中没有更多空间,则将逐出最旧命中的元素以便为您尝试将新元素放入缓存中。

因此,对于您的特定测试/代码,最终缓存中的密钥可能是每个驱逐策略的“key2”...当您输入“key1”时,“key”被驱逐,而当“key1”被驱逐时,“key1”被驱逐你输入了“key2”。

坦率地说,我不确定为什么你需要对缓存条目施加硬限制......而不是让它们自然地回收(可能会改变驱逐政策以使用LFU - 最后经常使用 - 所以你得到随着时间的推移,缓存条目在内存中的热点......

如果您使用带有BigMemory Max(http://terracotta.org/products/bigmemorymax)的群集缓存,则可以使用“maxEntriesInCache”设置硬限制(这仅适用于群集缓存)