Hazelcast:谓词绩效问题

时间:2016-03-22 12:50:42

标签: java performance hazelcast

在淡褐色地图上使用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映射中添加了索引。这是一次巨大的性能打击。

有人可以告诉我为什么会这样吗?

0 个答案:

没有答案