0

我正在尝试通过使用复合键来提高 Hazelcast 查找的性能。我有一个类实体:

Class Entity {
    
    private Long id;
    private String field1;
    private String field2;
    private String field3;
    
    // getter and setters
}

我在 hazelcast-server.xml 中添加了一个包含上述 3 个字段的复合索引:

...
<map name="Entity">
    <max-idle-seconds>2678400</max-idle-seconds>
    <time-to-live-seconds>2678400</time-to-live-seconds>
    <backup-count>3</backup-count>
    <async-backup-count>3</async-backup-count>
    <read-backup-data>true</read-backup-data>
    <indexes>
        <index ordered="false">field1, field2, field3</index>
    </indexes>
</map>
...

查询 Hazelcast 地图:

EntryObject entryObject = new PredicateBuilder().getEntryObject();
PredicateBuilder predicate = entryObject.get("field1").equal("value1")
                        .and(entryObject.get("field2").equal("value2"))
                        .and(entryObject.get("field3").equal("value3"));
IMap<Long, Entity> entityCache = hazelcastInstance.getMap("Entity")
List<Entity> routings = new ArrayList<>(entityCache.values(predicate));

无论有没有索引,代码都可以正常工作。

问题:

  1. 这是创建和使用复合索引的正确方法吗?
  2. 有没有办法检查索引是否实际被查询使用?(我无法在 hazelcast 管理中心控制台上获得任何与索引相关的信息)

我扫描了很多 hazelcast 文档和互联网论坛,但找不到具体的答案。

Hazelcast 版本:3.12 Java 版本:8

4

1 回答 1

0

无论有没有索引,代码都可以正常工作。

这很明显,因为不需要索引。

我没有测试,但是在这种情况下应该使用索引,应该使用所有三列。没有公共 API 可以查看是否实际使用了索引。您可以做的是将大量条目放入映射中,使用索引查询应该会快得多。另一种方法是调试查询执行,例如在 中放一个断点Indexes.matchIndex(),但我不确定这个类在 3.12 中是否相同。

于 2022-03-04T08:57:07.703 回答