用例: IMap并拥有70K条目。大多数操作都是GET调用多个键。 GET电话(90%)> PUT呼叫(10%)。我们正在使用EP进行PUT调用。
问题:获取多个实例的数据的最有效方法是什么?
可能的解决方案: 1.具有ReadOnly,Offloadable和使用executeOnKeys方法的EP。 2.并行执行所有键的map.get(key)。
有没有其他有效的方法来获取多个密钥的数据?
谓词
public class ExecuteOnSelectedKeyPredicateTest { public static void main(String [] args){ HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
IMap<String, Integer> map = hazelcastInstance.getMap("testMap");
map.put("testKey1", 1);
map.put("test", 2);
map.put("testKey3", 3);
// Get entries which ends with a number
Set<Map.Entry<String, Integer>> entries = map.entrySet(new ExecuteOnSelectedKeyPredicate("^.+?\\d$"));
System.out.println(entries);
}
public static class ExecuteOnSelectedKeyPredicate implements Predicate<String, Integer> {
private String keyRegex;
private transient Pattern pattern;
public ExecuteOnSelectedKeyPredicate(String keyRegex) {
this.keyRegex = keyRegex;
}
@Override
public boolean apply(Map.Entry<String, Integer> mapEntry) {
if (pattern == null) {
pattern = Pattern.compile(keyRegex);
}
Matcher matcher = pattern.matcher(mapEntry.getKey());
return matcher.matches();
}
}
}
答案 0 :(得分:1)
获取多个密钥,请求可能会转到多个成员。 executeOnKeys
在这里非常优秀,因为它计算了需要在其上执行操作的分区,并且它只将该操作发送到这些分区。
Offloadable确保您不会阻止partitionThreads和ReadOnly进一步优化处理。
多个get
操作将产生更多网络流量,因为每个密钥只有一个操作。