5.3. 使用 Data Grid 缓存驱除

驱除可让您以以下两种方式之一从内存中删除条目来控制数据容器的大小:

  • 条目总数(max-count)。
  • 最大内存量(最大大小)。

驱除会一次性丢弃来自数据容器的一个条目,并且是本地的到它发生的节点。

重要

从内存中移除条目,但不会从持久缓存存储中删除条目。要确保在 Data Grid 驱除后条目仍然可用,并防止与数据不一致,您应该配置持久性存储。

当您配置内存时,Data Grid approximates data 容器的当前内存用量。添加或修改条目时,Data Grid 会将数据容器的当前内存用量与最大大小进行比较。如果大小超过最大,Data Grid 将执行驱除。

驱除在线程中立即发生,它会添加一个超过最大大小的条目。

5.3.1. 驱除策略

当您配置 Data Grid 驱除时,可以指定:

  • 数据容器的最大大小。
  • 缓存达到阈值时删除条目的策略。

您可以手动执行驱除或配置 Data Grid 以执行以下操作之一:

  • 删除旧条目,为新条目腾出空间。
  • 引发 ContainerFullException 并防止创建新条目。

    例外驱除策略只适用于使用 2 阶段提交的事务缓存,而不适用于 1 阶段提交或同步优化。

有关驱除策略的详情,请参阅架构参考。

注意

数据网格包括 Caffeine 缓存库,它实现了 Least Frently Used (LFU)缓存替换算法(称为 TinyLFU)的变体。对于 off-heap 存储,Data Grid 使用 Least Recently Used (LRU)算法的自定义实现。

5.3.2. 配置最大计数驱除

将 Data Grid 缓存的大小限制为条目总数。

流程

  1. 打开 Data Grid 配置进行编辑。
  2. 使用 max-count 属性或 maxCount () 方法指定缓存在 Data Grid 执行驱除前可以包含的条目总数。
  3. 将以下内容设置为驱除策略来控制数据网格如何使用 when-full 属性或 whenFull () 方法删除条目。

    • REMOVE 数据网格执行驱除。这是默认的策略。
    • MANUAL 您为嵌入式缓存手动执行驱除。
    • EXCEPTION 数据网格丢弃异常,而不是驱除条目。
  4. 保存并关闭您的数据网格配置。
最大计数驱除

在以下示例中,Data Grid 会在缓存包含总计 500 个条目并且创建一个新条目时删除条目:

XML

<distributed-cache>
  <memory max-count="500" when-full="REMOVE"/>
</distributed-cache>

JSON

{
  "distributed-cache" : {
    "memory" : {
      "max-count" : "500",
      "when-full" : "REMOVE"
    }
  }
}

YAML

distributedCache:
  memory:
    maxCount: "500"
    whenFull: "REMOVE"

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.memory().maxCount(500).whenFull(EvictionStrategy.REMOVE);

5.3.3. 配置最大大小驱除

将数据网格缓存的大小限制为最大内存量。

流程

  1. 打开 Data Grid 配置进行编辑。
  2. 指定 application/x-protostream 作为缓存编码的介质类型。

    您必须指定一个二进制介质类型才能使用最大大小驱除。

  3. 使用 max-size 属性或 maxSize () 方法配置在 Data Grid 执行驱除前可以使用的最大内存量(以字节为单位)。
  4. (可选)指定字节测量单位。

    默认值为 B (字节)。请参考支持的单元的配置模式。

  5. 将以下内容设置为驱除策略来控制数据网格如何使用 when-full 属性或 whenFull () 方法删除条目。

    • REMOVE 数据网格执行驱除。这是默认的策略。
    • MANUAL 您为嵌入式缓存手动执行驱除。
    • EXCEPTION 数据网格丢弃异常,而不是驱除条目。
  6. 保存并关闭您的数据网格配置。
最大大小驱除

在以下示例中,Data Grid 会在缓存大小达到 1.5 GB (千兆字节)并且创建新条目时删除条目:

XML

<distributed-cache>
  <encoding media-type="application/x-protostream"/>
  <memory max-size="1.5GB" when-full="REMOVE"/>
</distributed-cache>

JSON

{
  "distributed-cache" : {
    "encoding" : {
      "media-type" : "application/x-protostream"
    },
    "memory" : {
      "max-size" : "1.5GB",
      "when-full" : "REMOVE"
    }
  }
}

YAML

distributedCache:
  encoding:
    mediaType: "application/x-protostream"
  memory:
    maxSize: "1.5GB"
    whenFull: "REMOVE"

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.encoding().mediaType("application/x-protostream")
       .memory()
         .maxSize("1.5GB")
         .whenFull(EvictionStrategy.REMOVE);

5.3.4. 手动驱除

如果您选择手动驱除策略,Data Grid 不会执行驱除。您必须使用 evict () 方法手动完成此操作。

您应该只在嵌入缓存中使用手动驱除。对于远程缓存,您应该始终使用 REMOVEEXCEPTION 驱除策略配置数据网格。

注意

当您启用 passivation 时,这个配置可防止警告消息,但不会配置驱除。

XML

<distributed-cache>
  <memory max-count="500" when-full="MANUAL"/>
</distributed-cache>

JSON

{
  "distributed-cache" : {
    "memory" : {
      "max-count" : "500",
      "when-full" : "MANUAL"
    }
  }
 }

YAML

distributedCache:
  memory:
    maxCount: "500"
    whenFull: "MANUAL"

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.encoding().mediaType("application/x-protostream")
       .memory()
         .maxSize("1.5GB")
         .whenFull(EvictionStrategy.REMOVE);

5.3.5. 通过驱除传递

在 Data Grid 驱除条目时,传递会持久保留数据到缓存存储。如果您启用通过,您应该总是启用驱除,如下例所示:

XML

<distributed-cache>
  <persistence passivation="true">
    <!-- Persistent storage configuration. -->
  </persistence>
  <memory max-count="100"/>
</distributed-cache>

JSON

{
  "distributed-cache": {
    "memory" : {
      "max-count" : "100"
    },
    "persistence" : {
      "passivation" : true
    }
  }
}

YAML

distributedCache:
  memory:
    maxCount: "100"
  persistence:
    passivation: "true"

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.memory().maxCount(100);
builder.persistence().passivation(true); //Persistent storage configuration