6.8. 基于文件的缓存存储


基于文件的缓存存储可在运行 Data Grid 的本地主机文件系统上提供持久存储。对于集群缓存,基于文件的缓存存储对于每个 Data Grid 节点都是唯一的。

警告

切勿将基于文件系统的缓存存储在共享文件系统上,如 NFS 或 Samba 共享,因为它们不提供文件锁定功能和数据损坏。

另外,如果您试图将事务缓存与共享文件系统搭配使用,在提交阶段写入文件时可能会出现不可恢复的故障。

soft-Index File Stores

SoftIndexFileStore 是基于文件的缓存存储的默认实现,并将数据存储在一组仅附加文件中。

当只附加文件时:

  • 达到其最大大小时,Data Grid 会创建一个新文件并开始写入该文件。
  • 达到低于 50% 的压缩阈值,Data Grid 将条目覆盖新文件,然后删除旧文件。
注意

在集群缓存中使用 SoftIndexFileStore 应该在启动时启用清除,以确保不会重新恢复过时的条目。

b+ 树

为提高性能,SoftIndexFileStore 中仅附加文件使用可保存在磁盘和内存中的 B+ Tree 进行索引。内存中索引使用 Java 软引用来确保如果由 Garbage Collection (GC)删除,则可以重新构建它,然后再次请求。

由于 SoftIndexFileStore 使用 Java 软引用来在内存中保留索引,因此这有助于防止内存不足异常。GC 在消耗太多内存前删除索引,同时仍然回退到磁盘。

SoftIndexFileStore 为每个配置的缓存段创建一个 B+ 树。这提供了一个额外的 "index",因为它只有多个元素,并为索引更新提供额外的并行性。目前,我们允许一个基于缓存片段数量的 6 个并行数量。

B+ 树中的每个条目都是节点。默认情况下,每个节点的大小限制为 4096 字节。如果密钥在序列化发生后较长,SoftIndexFileStore 会抛出异常。

文件限制

SoftIndexFileStore 将使用两个以及给定时间配置的 openFilesLimit 数量。为新更新的数据保留两个额外的文件指针,为日志附加器保留另一个用于压缩条目到新文件中。

为索引分配的打开的文件量是配置的 openFilesLimit 的总数之一。这个数字至少为 1 或缓存片段数。为打开数据文件本身分配从配置的限制中重新处理的任何数字。

分段

软索引文件存储始终是网段的。附加日志不是直接分段的,分段直接由索引处理。

过期

SoftIndexFileStore 对过期条目及其要求有全面支持。

单个文件缓存存储

注意

单个文件缓存存储现已弃用,并计划删除。

单个文件缓存存储,SingleFileStore,将数据保留到文件。Data Grid 还维护一个键的内存中索引,而键和值则存储在文件中。

由于 SingleFileStore 保留一个键的内存索引和值位置,因此需要额外的内存,具体取决于密钥大小和键数量。因此,对于密钥较大或者数量较大,我们不推荐使用 SingleFileStore

在某些情况下,SingleFileStore 也可以变得碎片。如果值大小持续增加,则不会使用单个文件中的可用空间,但该条目会附加到文件末尾。只有在条目可以适合时,才会使用文件中的可用空间。同样,如果您从内存中删除所有条目,则单个文件存储不会减小或进行碎片整理。

分段

默认情况下,单个文件缓存存储被分段为为每个片段有一个单独的实例,这会导致多个目录。每个目录都是代表数据映射段的数字。

6.8.1. 配置基于文件的缓存存储

将基于文件的缓存存储到 Data Grid,以在主机文件系统中保留数据。

先决条件

  • 如果您要配置嵌入式缓存,请启用全局状态并配置全局持久位置。

流程

  1. 在您的缓存配置中添加 persistence 元素。
  2. (可选)指定 true 作为 passivation 属性的值,以便仅在数据从内存中驱除时写入基于文件的缓存存储。
  3. 包含 file-store 元素,并根据情况配置属性。
  4. 指定 false 作为 shared 属性的值。

    基于文件的缓存存储对于每个 Data Grid 实例应始终是唯一的。如果要在集群中使用相同的持久性,请配置基于 JDBC 字符串的缓存存储等共享存储。

  5. 配置 索引和 数据元素,以指定 Data Grid 创建索引并存储数据的位置。
  6. 如果要使用 write-behind 模式配置缓存存储,请包含 write-behind 元素。
基于文件的缓存存储配置

XML

<distributed-cache>
  <persistence passivation="true">
     <file-store shared="false">
        <data path="data"/>
        <index path="index"/>
        <write-behind modification-queue-size="2048" />
     </file-store>
  </persistence>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "persistence": {
      "passivation": true,
      "file-store" : {
        "shared": false,
        "data": {
          "path": "data"
        },
        "index": {
          "path": "index"
        },
        "write-behind": {
          "modification-queue-size": "2048"
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  persistence:
    passivation: "true"
    fileStore:
      shared: "false"
      data:
        path: "data"
      index:
        path: "index"
      writeBehind:
        modificationQueueSize: "2048"
Copy to Clipboard Toggle word wrap

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence().passivation(true)
       .addSoftIndexFileStore()
          .shared(false)
          .dataLocation("data")
          .indexLocation("index")
          .modificationQueueSize(2048);
Copy to Clipboard Toggle word wrap

6.8.2. 配置单个文件缓存存储

如果需要,您可以将 Data Grid 配置为创建单个文件存储。

重要

单个文件存储已弃用。与单个文件存储相比,您应该使用 soft-index 文件存储来提高性能和数据一致性。

先决条件

  • 如果您要配置嵌入式缓存,请启用全局状态并配置全局持久位置。

流程

  1. 在您的缓存配置中添加 persistence 元素。
  2. (可选)指定 true 作为 passivation 属性的值,以便仅在数据从内存中驱除时写入基于文件的缓存存储。
  3. 包含 single-file-store 元素。
  4. 指定 false 作为 shared 属性的值。
  5. 根据需要配置任何其他属性。
  6. 包含 write-behind 元素,将缓存存储配置为后面的写入,而不是作为写入。
单个文件缓存存储配置

XML

<distributed-cache>
  <persistence passivation="true">
    <single-file-store shared="false"
                       preload="true"/>
  </persistence>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "persistence" : {
      "passivation" : true,
      "single-file-store" : {
        "shared" : false,
        "preload" : true
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  persistence:
    passivation: "true"
    singleFileStore:
      shared: "false"
      preload: "true"
Copy to Clipboard Toggle word wrap

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence().passivation(true)
       .addStore(SingleFileStoreConfigurationBuilder.class)
          .shared(false)
          .preload(true);
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat