当前位置: 首页 > 知识库问答 >
问题:

需要帮助提高Hazelcast查询性能吗

澹台华翰
2023-03-14

我有大约20万张唱片要储存。我已经实现了Java客户端来从hazelcast地图中搜索记录。我没有在预期时间内得到搜索结果。

一旦我做Hazelcast喜欢或在查询,它需要最少400到500毫秒。

是否可以更改服务器端和客户端配置以提高吞吐量?

我用键值将JavaBean信息存储在Map中。我还在一个字段上创建了索引。还实现了身份序列化机制

服务器端配置(使用XML文件设置服务器):

<map name="app-data">
    <in-memory-format>BINARY</in-memory-format>
    <statistics-enabled>false</statistics-enabled>
    <optimize-queries>false</optimize-queries>
    <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    <backup-count>0</backup-count>
    <async-backup-count>0</async-backup-count>
    <time-to-live-seconds>0</time-to-live-seconds>
    <max-idle-seconds>0</max-idle-seconds>
    <eviction-policy>NONE</eviction-policy>
    <max-size policy="PER_NODE">2147483647</max-size>
    <eviction-percentage>25</eviction-percentage>
    <min-eviction-check-millis>100</min-eviction-check-millis>
    <merge-policy batch-size="100">com.hazelcast.map.merge.LatestUpdateMapMergePolicy</merge-policy>
    <read-backup-data>false</read-backup-data>
    <hot-restart enabled="false">
        <fsync>false</fsync>
    </hot-restart>
    <map-store enabled="false" initial-mode="LAZY">
        <write-delay-seconds>0</write-delay-seconds>
        <write-batch-size>1</write-batch-size>
    </map-store>
    <indexes>
        <index ordered="true">index</index>
    </indexes>
</map>

<data-serializable-factories>
        <data-serializable-factory factory-id="1">com.tmobile.services.cacheserver.config.hazelcast.cache.serialization.CacheServerDataSerializableFactory</data-serializable-factory>

客户端代码:

ClientConfig config = new ClientConfig();

    config.getSerializationConfig()
          .addDataSerializableFactory(
            CacheServerDataSerializableFactory.FACTORY_ID,
            new CacheServerDataSerializableFactory());

    config.getNetworkConfig().setAddresses(addresses).setConnectionAttemptPeriod(3000)
          .getSocketOptions().setBufferSize(256 * SocketOptions.KILO_BYTE);

    HazelcastInstance hazelcastInstance = HazelcastClient.newHazelcastClient(config);
    return hazelcastInstance;

我使用了hazelcast版本as 3.11。

下面是我用来存储信息的对象。

    public class AppData implements IdentifiedDataSerializable {

    private static final long serialVersionUID = 1L;

    @JsonIgnore
    private Long index = 0l;

    private Integer appId = 0;

    public void setIndex(Integer index) {
        this.index = index;
    }

    public Integer getIndex() {
        return this.index;
    }

    public void setAppId(Integer appId) {
        this.appId = appId;
    }

    public Integer getAppId() {
        return this.appId;
    }

    @Override
    public final int hashCode() {
        return Objects.hash(this.getAppId());
    }

    @Override
    public void writeData(ObjectDataOutput out) throws IOException {
        out.writeLong(index);
        out.writeInt(appId);
    }

    @Override
    public void readData(ObjectDataInput in) throws IOException {

        this.index = in.readLong();
        this.appId = in.readInt();
    }

    @Override
    @JsonIgnore
    public int getFactoryId() {
        return CacheServerDataSerializableFactory.APP_DATE_FACTORY_TYPE;
    }

    @Override
    @JsonIgnore
    public int getId() {
        return CacheServerDataSerializableFactory.APP_DATE_ID;
    }
}

我使用了下面的查询/谓词来过滤数据。

Predicate pred = new InPredicate(attribute, (Comparable[]) ((List) filterValue).toArray(new String[0]));
Collection<Object> items =  map.values(predicate);

共有1个答案

许嘉珍
2023-03-14

@Prashant,因为在谓词中,只命中了索引n次

您可以在成员配置上设置以下属性

<代码>

请阅读有关索引复制行为的文档。

 类似资料:
  • 我有这张桌子: 这是我的SQL查询: 我想要的查询是: > 我希望获得符合某些条件的记录,特别是字段在最近24小时内的记录 我需要获得紧接在#1中的记录之前的记录 将#1中的结果进一步过滤到其价格列在记录的历史记录中具有不同值(而不是-1)的记录 我面临的问题是查询太慢了。我有一百万张唱片。执行查询大约需要2分钟。我猜GROUP BY会使查询变慢。我想我需要做一个综合指数,但我不知道怎么做。 解释

  • 我的问题类似于SQL选择组查询。但是架构发生了变化,我想要不同的结果,如下所述。给定链接的解决方案没有给我正确的解决方案。您可以使用SQL小提琴来解决这个问题。 下面是我的桌子 表1 现在,我想显示每个产品的两个最低金额,如果金额相同,那么任何人都按照升序排列... 所以我想构建单个SQL查询,它给我的结果如下。 请帮我建立这样的查询。

  • 编写一个查询以显示staffid、费用代码、专科id、专科名称、会诊日期、患者号和到期日将使用会诊日期+21计算 STAFFID NOT NULL CHAR(2) FIRSTNAME VARCHAR2(20) LASTNAME VARCHAR2(20) 角色VARCHAR2(15) 性别CHAR(1) 日期连接日期 DATELEFT DATE SQL>描述staffspeciality错误: OR

  • 我正在数据库中运行以下查询: 它输出500行,其中只有一个结果列,运行大约需要1分钟43秒。输出以下计划: 逻辑是:对于每个选择的(在500个id的列表中)计算整数列,返回该金额与数字2147483647之间的较小值。结果必须包含500行,每个id对应一行,我们已经知道它们将与子查询中的至少一行匹配,因此不会生成空值。 索引仅是上的一个b树,属于整数类型。索引是主键上的b树,也是整数类型。表中的每

  • 问题内容: 我正在使用Glassfish和JSF构建我的第一个Java EE Web应用程序。我对条件查询还很陌生,我有一个需要执行的查询,但是javaee6教程的示例似乎有些稀疏。无论如何,我很难创建查询。 目标:我想让公司存储最多的文件。公司与Documents有OneToMany关系。文档与多个表具有ManyToOne关系,“用户类型”列将它们区分开。 MySQL查询: 谢谢 --updat

  • 问题内容: 怀疑在VBA ADO和Sql查询中… 我有2张纸,即adodc1,adodc2(在一本工作簿中) 在adodc1中具有“名称”,“部门”列,有时其具有“ Sect”列 在adodc2中具有“名称”,“部门”,“宗派”列 我想要的是当我运行Query..Vba时需要检查adodc1是否具有Sect列。 要返回为空值.. 下面的代码取自“”,根据我的需要进行了更改 它将执行的工作是来自两张