Here您可以阅读Hazelcast中查询(不是获取操作)的工作原理:
- 请求的谓词将发送给群集中的每个成员。
- 每个成员查看自己的本地条目并根据谓词过滤它们。在这个阶段,键/值对 条目被反序列化,然后传递给谓词。
- 谓词请求者将来自每个成员的所有结果合并为一个集合。
醇>
但很难找到有关某些条目被驱逐后会发生什么的明确细节。假设已为目标地图提供MapStore
,查询是否会执行loadAll
?是否可以为load
或store
?
我怀疑两种情况下的答案都是NO(在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
等方法?
答案 0 :(得分:1)
如果您使用map作为数据网格而不是缓存,即当没有为地图定义驱逐时,查询是有意义的。
如果引入了类似loadQueryMatches的方法;然后所有查询操作都应该从数据存储执行查询,因为您无法确定地图是否包含所有项目(可能有一些项目被驱逐)。它不会使用IMap,因为每个查询请求都将被转发到数据库。