5.3. 使用 Data Grid 缓存驱除
驱除可让您以两种方式之一从内存中删除条目来控制数据容器的大小:
-
条目总数(
max-count)。 -
最大内存量(
max-size)。
驱除一次从数据容器丢弃一个条目,并且对发生的节点而言是本地的。
驱除从内存中删除条目,但不会从持久缓存存储中删除条目。要确保条目在 Data Grid 驱除它们后仍然可用,并防止数据不一致,您应该配置持久性存储。
当您配置 内存 时,Data Grid 大致大致是数据容器的当前内存用量。添加或修改条目时,Data Grid 将数据容器的当前内存用量与最大大小进行比较。如果大小超过最大值,Data Grid 会执行驱除。
驱除会在线程中立即发生,添加超过最大大小的条目。
5.3.1. 驱除策略 复制链接链接已复制到粘贴板!
当您配置 Data Grid 驱除时,您可以指定:
- 数据容器的最大大小。
- 在缓存达到阈值时删除条目的策略。
您可以手动执行驱除,或者将 Data Grid 配置为执行以下操作之一:
- 删除旧条目以为新条目腾出空间。
抛出
ContainerFullException,并阻止创建新条目。例外驱除策略只适用于使用 2 阶段提交的事务缓存,而不适用于 1 阶段提交或同步优化。
有关驱除策略的详情,请参阅架构引用。
Data Grid 包括 Caffeine 缓存库,它实现了 Least Frequently Used (LFU)缓存替换算法,称为 TinyLFU。对于非堆存储,Data Grid 使用 Least Recently Used (LRU)算法的自定义实现。
5.3.2. 配置最大计数驱除 复制链接链接已复制到粘贴板!
将 Data Grid 缓存的大小限制为条目总数。
流程
- 打开 Data Grid 配置以进行编辑。
-
指定缓存在 Data Grid 执行驱除前可以包含的条目总数,使用
max-count属性或maxCount ()方法。 将以下之一设置为驱除策略,以控制 Data Grid 如何使用
when-full属性或Full ()方法删除条目。-
REMOVEData Grid 执行驱除。这是默认策略。 -
MANUAL为嵌入式缓存手动执行驱除。 -
EXCEPTIONData Grid 会抛出异常而不是驱除条目。
-
- 保存并关闭您的 Data Grid 配置。
最大计数驱除
在以下示例中,当缓存包含总计 500 个条目和新条目时,Data Grid 会删除条目:
XML
<distributed-cache> <memory max-count="500" when-full="REMOVE"/> </distributed-cache>
<distributed-cache>
<memory max-count="500" when-full="REMOVE"/>
</distributed-cache>
JSON
YAML
distributedCache:
memory:
maxCount: "500"
whenFull: "REMOVE"
distributedCache:
memory:
maxCount: "500"
whenFull: "REMOVE"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.memory().maxCount(500).whenFull(EvictionStrategy.REMOVE);
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.memory().maxCount(500).whenFull(EvictionStrategy.REMOVE);
5.3.3. 配置最大大小驱除 复制链接链接已复制到粘贴板!
将 Data Grid 缓存的大小限制为最大内存量。
流程
- 打开 Data Grid 配置以进行编辑。
指定
application/x-protostream作为缓存编码的介质类型。您必须指定二进制介质类型才能使用最大大小驱除。
-
配置最大内存量(以字节为单位),缓存可在 Data Grid 使用
max-size属性或maxSize ()方法执行驱除前使用。 (可选)指定测量单位。
默认值为 B (字节)。请参阅 支持的单元的配置模式。
将以下之一设置为驱除策略,以控制 Data Grid 如何使用
when-full属性或whenFull ()方法删除条目。-
REMOVEData Grid 执行驱除。这是默认策略。 -
MANUAL为嵌入式缓存手动执行驱除。 -
EXCEPTIONData Grid 会抛出异常而不是驱除条目。
-
- 保存并关闭您的 Data Grid 配置。
最大大小驱除
在以下示例中,当缓存的大小达到 1.5 GB (千兆字节)和新条目时,Data Grid 会删除条目:
XML
<distributed-cache> <encoding media-type="application/x-protostream"/> <memory max-size="1.5GB" when-full="REMOVE"/> </distributed-cache>
<distributed-cache>
<encoding media-type="application/x-protostream"/>
<memory max-size="1.5GB" when-full="REMOVE"/>
</distributed-cache>
JSON
YAML
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.encoding().mediaType("application/x-protostream")
.memory()
.maxSize("1.5GB")
.whenFull(EvictionStrategy.REMOVE);
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.encoding().mediaType("application/x-protostream")
.memory()
.maxSize("1.5GB")
.whenFull(EvictionStrategy.REMOVE);
5.3.4. 手动驱除 复制链接链接已复制到粘贴板!
如果您选择手动驱除策略,Data Grid 不会执行驱除。您必须使用 evict () 方法手动完成此操作。
您应该只在嵌入式缓存中使用手动驱除。对于远程缓存,您应该始终使用 REMOVE 或 EXCEPTION 驱除策略配置 Data Grid。
此配置可防止当您启用 passivation 时警告信息,但没有配置驱除。
XML
<distributed-cache> <memory max-count="500" when-full="MANUAL"/> </distributed-cache>
<distributed-cache>
<memory max-count="500" when-full="MANUAL"/>
</distributed-cache>
JSON
YAML
distributedCache:
memory:
maxCount: "500"
whenFull: "MANUAL"
distributedCache:
memory:
maxCount: "500"
whenFull: "MANUAL"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.encoding().mediaType("application/x-protostream")
.memory()
.maxSize("1.5GB")
.whenFull(EvictionStrategy.REMOVE);
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.encoding().mediaType("application/x-protostream")
.memory()
.maxSize("1.5GB")
.whenFull(EvictionStrategy.REMOVE);
5.3.5. 使用驱除进行传递 复制链接链接已复制到粘贴板!
当 Data Grid 驱除条目时,传递会保留数据到缓存存储。如果启用 passivation,则应始终启用驱除,如下例所示:
XML
JSON
YAML
distributedCache:
memory:
maxCount: "100"
persistence:
passivation: "true"
distributedCache:
memory:
maxCount: "100"
persistence:
passivation: "true"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.memory().maxCount(100); builder.persistence().passivation(true); //Persistent storage configuration
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.memory().maxCount(100);
builder.persistence().passivation(true); //Persistent storage configuration