第 1 章 索引数据网格缓存
Data Grid 可在您的缓存中创建值索引,以提高查询性能,从而提供比非索引查询更快地的结果。索引还允许您在查询中使用全文本搜索功能。
Data Grid 使用 Apache Lucene 技术来索引缓存中的值。
1.1. 将 Data Grid 配置为索引缓存
在缓存配置中启用索引,并指定在创建索引时应包含哪些实体数据网格。
在使用查询时,您应该始终将 Data Grid 配置为索引缓存。索引为您的查询提供了显著的性能,允许您更快地了解您的数据。
流程
在缓存配置中启用索引。
<distributed-cache> <indexing> <!-- Indexing configuration goes here. --> </indexing> </distributed-cache>
提示在您的
配置中添加
indexing 元素可启用索引,而无需包含enabled=true
属性。对于远程缓存,添加此元素也会隐式将编码配置为 ProtoStream。
使用
indexed-entity
元素指定要索引的实体。<distributed-cache> <indexing> <indexed-entities> <indexed-entity>...</indexed-entity> </indexed-entities> </indexing> </distributed-cache>
protobuf 消息
指定 schema 中声明的消息作为
indexed-entity
元素的值,例如:<distributed-cache> <indexing> <indexed-entities> <indexed-entity>org.infinispan.sample.Car</indexed-entity> <indexed-entity>org.infinispan.sample.Truck</indexed-entity> </indexed-entities> </indexing> </distributed-cache>
此配置使用
book_sample
软件包名称对模式中的书签消息进行索引。package book_sample; /* @Indexed */ message Book { /* @Field(store = Store.YES, analyze = Analyze.YES) */ optional string title = 1; /* @Field(store = Store.YES, analyze = Analyze.YES) */ optional string description = 2; optional int32 publicationYear = 3; // no native Date type available in Protobuf repeated Author authors = 4; } message Author { optional string name = 1; optional string surname = 2; }
Java 对象
-
指定包含
@Indexed
注释的每个类的完全限定名称(FQN)。
XML
<distributed-cache> <indexing> <indexed-entities> <indexed-entity>book_sample.Book</indexed-entity> </indexed-entities> </indexing> </distributed-cache>
ConfigurationBuilder
import org.infinispan.configuration.cache.*; ConfigurationBuilder config=new ConfigurationBuilder(); config.indexing().enable().storage(FILESYSTEM).path("/some/folder").addIndexedEntity(Book.class);
1.1.1. 索引配置
Data Grid 配置控制索引的存储和构建方式。
1.1.1.1. 索引存储
您可以配置 Data Grid 如何存储索引:
- 在主机文件系统中,这是默认值并在重启之间保留索引。
-
在 JVM 堆内存中,这意味着索引不会在重启后。
您应该仅将索引存储在 JVM 堆内存中,以用于小型数据集。
File system
<distributed-cache> <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir"> <!-- Indexing configuration goes here. --> </indexing> </distributed-cache>
JVM 堆内存
<distributed-cache> <indexing storage="local-heap"> <!-- Additional indexing configuration goes here. --> </indexing> </distributed-cache>
1.1.1.2. 索引读取器
索引读取器是一个内部组件,提供对索引的访问来执行查询。随着索引内容的变化,Data Grid 需要刷新读取器,以便搜索结果为最新版本。您可以为索引读取器配置刷新间隔。默认情况下,如果索引自上次刷新后改变,Data Grid 会在每个查询前读取索引。
<distributed-cache> <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir"> <!-- Sets an interval of one second for the index reader. --> <index-reader refresh-interval="1000"/> <!-- Additional indexing configuration goes here. --> </indexing> </distributed-cache>
1.1.1.3. 索引写入器
索引写入程序是一个内部组件,它构造由一个或多个片段(子索引)组成的索引,可随着时间的推移合并以提高性能。较少的片段通常意味着在查询期间较少的开销,因为索引读取器操作需要考虑所有片段。
数据中心在内部使用 Apache Lucene,并在两个层(内存和存储)中索引条目。新条目首先进入内存索引,然后在发生清除时进入配置的索引存储。定期提交操作发生,从之前清除的数据创建片段,并使所有索引更改持久。
index-writer
配置是可选的。对于大多数情况和自定义配置,默认值应该只用于调整性能。
<distributed-cache> <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir"> <index-writer commit-interval="2000" low-level-trace="false" max-buffered-entries="32" queue-count="1" queue-size="10000" ram-buffer-size="400" thread-pool-size="2"> <index-merge calibrate-by-deletes="true" factor="3" max-entries="2000" min-size="10" max-size="20"/> </index-writer> <!-- Additional indexing configuration goes here. --> </indexing> </distributed-cache>
属性 | 描述 |
---|---|
| 索引在内存中缓冲的索引更改的时间(以毫秒为单位)会刷新到索引存储中,并执行提交。由于操作非常昂贵,因此应该避免较小的值。默认值为 1000 毫秒(1 秒)。 |
|
在将内存刷新到索引存储前可缓冲的最大条目数。较大的值会导致索引更快,但使用更多内存。当与 |
|
在将添加的条目刷新到索引存储前,可用于缓冲添加条目的最大内存量。较大的值会导致索引更快,但使用更多内存。为加快索引性能,您应该设置此属性而不是 |
| 对索引执行写入操作的线程数量。 |
|
用于每个索引类型的内部队列数量。每个队列都包含一系列应用于索引和队列的修改,这些修改并行处理。增加队列数量将导致索引吞吐量增加,但只有瓶颈是 CPU 时。对于最佳结果,请不要为大于 |
|
每个队列可以保留的最大元素数。增加 |
| 为索引操作启用低级追踪信息。启用此属性可显著降低性能。您应该只使用这个低级追踪作为故障排除的最后资源。 |
要配置 Data Grid 如何合并索引片段,您可以使用 index-merge
子元素。
属性 | 描述 |
---|---|
| 索引片段在合并前可以具有的最大条目数。超过此条目的片段不会合并。较小的值在频繁更改索引时更好地执行,如果索引经常没有改变,较大的值可以提供更好的搜索性能。 |
| 同时合并的片段数。使用较小的值时,合并会更频繁地使用更多资源,但片段总数会降低,从而增加搜索性能。较大的值(同意大于 10)最适合大量编写场景。 |
| 最小片段的目标大小(以 MB 为单位)用于后台合并。小于这个大小的片段会更积极地合并。设置太大的值可能会导致昂贵的合并操作,即使它们的频率较低。 |
|
后台合并的最大片段大小(以 MB 为单位)。大于这个大小的片段不会在后台合并。把它设置为较低值有助于降低内存要求,并避免在最佳搜索速度成本上出现一些合并操作。当强制合并索引和 |
|
强制合并并覆盖 |
|
在计算片段中的条目时,是否应该考虑索引中删除条目的数量。设置 |
其他资源