2

Ehcache 的 2.5.x文档指出,它的标准实现提供了缓存搜索功能,而不依赖于索引并设法产生良好的性能(对于高达 1M 元素的缓存<1s)。实验验证了这一说法。但是,这确实会降低(通过 O(N))更大的缓存。

该文档进一步指出,通过使用分布式缓存实现(“由 Terracotta 服务器阵列支持”),可以获得索引的好处。然而,对于超过 1M 元素的较小缓存似乎没有解决方案,这些缓存足够小,不需要分发(我们的缓存可以在 ~1Gb 缓存中容纳 1.2M 元素)。

有没有人找到一种解决方法/解决方案来为此类情况提供索引,或者这是否需要采用某种大锤的方法来分发缓存?

这个索引功能是否需要商业 Terracotta 许可证也有点不清楚(我的印象是 Terracotta 产品的部分是免费提供的,尽管显然没有支持?)

4

1 回答 1

1

我认为 EhCache 索引功能与 Terracotta 无关。它是 EhCache 的核心功能。我正在使用由商业版 Terracotta 支持的 Ehcache 和 Ehcache。

当您提供 ehcache.xml 配置时,您必须指定哪些字段是可搜索的(这将在每次缓存或更新/删除缓存中的新对象时触发 Lucene 的索引活动)

这是此类配置的示例(我已根据您的要求设置了 maxBytesLocalHeap="1024m" ):

<?xml version="1.0" encoding="UTF-8"?>
<ehcache maxBytesLocalHeap="1024m">
 <sizeOfPolicy maxDepth="2000" />
 <defaultCache eternal="false" timeToLiveSeconds="600"/>
 <cache name="myCacheablePOJO" eternal="true" statistics="true">
  <searchable>
   <searchAttribute name="field1" />
   <searchAttribute name="field2" />
   <searchAttribute name="field3" />
  </searchable>
 </cache>
</ehcache>

当您使用基于 Terracotta 的 EhCache API 实现时,您必须在类路径中添加额外的 jar 并在配置中启用 terracotta:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache maxBytesLocalHeap="1.3g">
 <sizeOfPolicy maxDepth="2000" />
 <defaultCache eternal="false" timeToLiveSeconds="600">
  <terracotta/>
 </defaultCache>
 <cache name="myCacheablePOJO" eternal="true" statistics="true">
  <searchable>
   <searchAttribute name="field1" />
   <searchAttribute name="field2" />
   <searchAttribute name="field3" />
   </searchable>
   <terracotta compressionEnabled="true" />
 </cache>
</ehcache>

请注意,我已在缓存名称="myCacheablePOJO" 中添加了“terracotta”标签,并带有一个可选属性以启用缓存中的对象压缩(节省内存空间并降低性能成本)。

因此,换句话说,在没有 Terracotta 集群的情况下,本地 EhCache 中的 1.2M 元素应该没问题。您应该考虑的唯一问题是故障转移。你应该问自己以下问题:

  • 我的系统缓存策略是什么?
  • 如果 JVM 崩溃,系统能否承受丢失缓存数据的损失?
  • 如果 JVM 重新启动,数据如何填充到本地缓存中?
于 2012-09-26T15:20:04.417 回答