2.10. 索引和查询缓存


查询数据平面缓存可让您分析和过滤数据以获得实时分析。例如,一个在线游戏,其中播放者以某种方式相互竞争。如果要在任何时间点上使用前十个播放器实现领导板,您可以创建一个查询来查找哪个播放者在任意时间点上具有最多点,并将结果限制为最多 10 个,如下所示:

QueryFactory queryFactory = Search.getQueryFactory(playersScores);
Query topTenQuery = queryFactory
  .create("from com.redhat.PlayerScore ORDER BY p.score DESC, p.timestamp ASC")
  .maxResults(10);
List<PlayerScore> topTen = topTenQuery.execute().list();
Copy to Clipboard Toggle word wrap

前面的示例演示了使用查询的好处,因为它可让您找到与可能数百万缓存条目相关的条件的十个条目。

但是,在性能影响方面,您应该考虑索引操作与查询操作所带来的权衡。将 Data Grid 配置为索引缓存可更快地进行查询。如果没有索引,查询必须滚动缓存中的所有数据,根据类型和数据数量,按 magnitude 的顺序减慢结果。

在启用索引时,对写入的性能有可测量的丢失。但是,由于一些小心的计划,并对要索引的内容有很好的了解,您可以避免影响最差。

最有效的方法是将 Data Grid 配置为仅索引您需要的字段。无论您存储 Plain Old Java 对象(POJO)还是使用 Protobuf 模式,您注解的更多字段都会花费更长的字段来构建索引。如果您有一个含有五个字段的 POJO,但您只需要查询这两个字段,请不要将 Data Grid 配置为索引您不需要的三个字段。

Data Grid 为您提供了几个选项来调优索引操作。例如,Data Grid 存储索引与数据不同,请将索引保存到磁盘而不是内存。每当添加、修改或删除条目时,使用索引写入器将索引与缓存保持与缓存同步。如果您启用索引,然后观察到较慢的写入,并考虑索引会导致性能丢失,您可以在写入磁盘前将索引保留在内存缓冲区中,以便更长的时间。这会更快地进行索引操作,并有助于降低写入吞吐量,但会消耗更多内存。对于大多数部署,但默认索引配置都适合,且不会减慢写入速度。

在某些情况下,可能不对缓存进行索引,比如对于需要查询不经常查询的写密集型缓存,且不需要产生毫秒。它都取决于您要实现的功能。更快的查询意味着更快的读取速度,但会牺牲索引的较慢的写入成本。

2.10.1. 持续查询和数据平面性能

持续查询为应用程序提供恒定的更新流,生成大量事件。Data Grid 会临时为它生成的每个事件分配内存,这可能会导致内存压力,并可能导致 OutOfMemoryError 异常,特别是远程缓存。因此,您应该仔细设计您的持续查询以避免任何性能影响。

Data Grid 强烈建议您将持续查询的范围限制为您需要的最小信息量。要达到此目的,您可以使用 projections 和 predicates。例如,以下语句只提供有关与条件匹配而不是整个条目的字段子集的结果:

SELECT field1, field2 FROM Entity WHERE x AND y
Copy to Clipboard Toggle word wrap

确保您创建的每个 ContinuousQueryListener 都可以快速处理所有接收的事件,而不阻断线程。要达到此目的,您应该避免任何不必要的生成事件的缓存操作。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat