我认为 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 重新启动,数据如何填充到本地缓存中?