Hazelcast 驱逐和分布式查询
Hazelcast eviction and distributed queries
Here 您可以阅读 Hazelcast 中查询(不是 get 操作)的工作原理:
- The requested predicate is sent to each member in the cluster.
- 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.
- The predicate requester merges all the results coming from each member into a single set.
但是很难找到有关驱逐某些条目时发生的情况的明确详细信息。假设已为目标地图提供 MapStore
,查询是否会执行 loadAll
?是否可以针对 load
或 store
定义这种情况的行为?
我怀疑这两种情况的答案是否定的(我在 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,因为每个查询请求都会被转发到数据库。
Here 您可以阅读 Hazelcast 中查询(不是 get 操作)的工作原理:
- The requested predicate is sent to each member in the cluster.
- 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.
- The predicate requester merges all the results coming from each member into a single set.
但是很难找到有关驱逐某些条目时发生的情况的明确详细信息。假设已为目标地图提供 MapStore
,查询是否会执行 loadAll
?是否可以针对 load
或 store
定义这种情况的行为?
我怀疑这两种情况的答案是否定的(我在 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,因为每个查询请求都会被转发到数据库。