在这里您可以阅读查询(不是Get操作)在Hazelcast中的工作方式:
- 请求的谓词被发送给集群中的每个成员。
- 每个成员都查看自己的本地条目,并根据谓词对其进行过滤。在此阶段,钥匙/价值对 条目被应对,然后传递给谓词。
- 谓词请求者将每个成员的所有结果合并为一个集合。
,但是很难找到有关驱逐某些条目时发生的情况的明确细节。假设已经为目标地图提供了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,因为每个查询请求都会转发到数据库。