Hazelcast 驱逐和分布式查询

Hazelcast eviction and distributed queries

Here 您可以阅读 Hazelcast 中查询(不是 get 操作)的工作原理:

  1. The requested predicate is sent to each member in the cluster.
  2. Each member looks at its own local entries and filters them according to the predicate. At this stage, key/value pairs of the entries are deserialized and then passed to the predicate.
  3. The predicate requester merges all the results coming from each member into a single set.

但是很难找到有关驱逐某些条目时发生的情况的明确详细信息。假设已为目标地图提供 MapStore,查询是否会执行 loadAll?是否可以针对 loadstore 定义这种情况的行为?

我怀疑这两种情况的答案是否定的(我在 MapStore 接口中找不到处理与存储相关的查询的方法):

public interface MapStore<K, V> extends MapLoader<K, V> {
    void store(K var1, V var2);

    void storeAll(Map<K, V> var1);

    void delete(K var1);

    void deleteAll(Collection<K> var1);
}

public interface MapLoader<K, V> {
    V load(K var1);

    Map<K, V> loadAll(Collection<K> var1);

    Set<K> loadAllKeys();
}

因此,同一个查询,在不同时间对同一个映射执行,除了逐出之外没有通过其他方式修改,可能会提供不同的结果集。

我希望看到类似的内容:

    /* Fetch all query matches and return them */
    Map<K, V> loadQueryMatches(Predicate<K,V> p)

或者:

    /* Fetch all query matches and return them */
    Map<K, V> loadQueryMatches(String hzQuery)

遗憾的是,它不存在。但是,如果在某些配置下,由于驱逐后缺少某些条目,它们的行为可能看起来不确定,那么提供地图查询的意义何在?您知道是否计划包含 loadQueryMatches 之类的方法吗?

如果您将地图用作数据网格而不是缓存,即当没有为地图定义驱逐时,查询是有意义的。

如果引入类似loadQueryMatches的方法;那么所有查询操作都应该从数据存储中进行查询,因为您无法确定地图是否包含所有项目(可能有一些项目被驱逐)。它不会使用 IMap,因为每个查询请求都会被转发到数据库。