在淡褐色地图上使用Predicate
时,我在hazelcast中遇到了性能问题。
所以我有一个模型类,如下所示:
public class MyAccount {
private String account;
private Date startDate;
private Date endDate;
private MyEnum accountTypeEnum;
// Overrides equals and hascodes using all the attributes
// Has getters and setters for all the attributes
}
然后我创建一个Hazelcast<MyAccount, String>
类型的hazelcast实例。在那个例子中,我开始将MyAccount
对象保存为键和相关字符串作为其值。
注意事项:我将这些帐户保存在不同的地图中(比如说地方,州,国家和国际)
根据帐户的地理位置,在不同的地图中创建约180,000个MyAccount
对象并保存在淡褐色中。除此之外,hazelcast还将另外50,000个字符串对象存储为不同地图中的键和值(不包括上面提到的地图)
然后我有一个方法,它使用属性account,
startDate and endDate
上的谓词过滤器来过滤掉帐户。让我们将此方法称为过滤器。
public static Predicate filter(String account, Date date) {
EntryObject entryObject = new PredicateBuilder().getEntryObject();
PredicateBuilder accountPredicate = entryObject.key().get(Constants.ACCOUNT).equal(account);
PredicateBuilder startDatePredicate = entryObject.key().get(Constants.START_DATE).isNull().or(entryObject.key().get(Constants.START_DATE).lessEqual(date));
PredicateBuilder endDatePredicate = entryObject.key().get(Constants.END_DATE).isNull().or(entryObject.key().get(Constants.END_DATE).greaterThan(date));
return accountPredicate.and(effectiveDatePredicate.and(endDatePredicate));
}
private void addIndexesToHazelcast() {
Arrays.asList("LOCAL", "STATE", "NATIONAL", "INTERNATIONAL").forEach(location -> {
IMap<Object, Object> map = hazelcastInstance.getMap(location);
map.addIndex("__key." + "startDate", true);
map.addIndex("__key." + "endDate", true);
map.addIndex("__key." + "account", false);
});
}
问题:对于特定的地图,比如说本地,它包含大约80,000个对象,当我使用谓词从地图中获取值时,大约需要4-7秒,这是不可接受的。
Predicate predicate = filter(account, date);
String value = hazelcast.getMap(mapKey).values(predicate); // This line takes 4-7 secs
我很惊讶缓存应该花费4-7秒来获取单个帐户的值,因为我已经在相同属性的hazelcast映射中添加了索引。这是一次巨大的性能打击。
有人可以告诉我为什么会这样吗?