Aerospike耗时太长,无法插入1000万个关键值

时间:2016-03-29 12:09:41

标签: java aerospike

Aerospike花了将近70分钟来插入1000万个关键值。我要遵循的步骤是:

  1. 我在内存中拥有所有键值

  2. 在aerospike服务器上注册aerospike udf

  3. 开始为java代码迭代1000万次,并为每个键和值调用aerospike udf模块。

  4. 在udf中,我正在检查密钥是否已经存在。如果是,则更新否则插入。

  5. 我有2个具有复制因子2的aerospike服务器。

  6. 有没有办法提高写入性能或执行批量写入。我知道airospike不支持批量写入。任何优化写操作的建议。

    我用的代码

    private void put(String namespace, String setName, String binName, String keyVlaue, List<Integer> listIdsToBeAdd, List<Integer> listIdToBeRemoved) {
        Key key = new Key(namespace, setName, keyVlaue);
        getAerospikeClient().execute(writePolicy, key, "aerospike_udf", "update_record", Value.get(listIdsToBeAdd), Value.get(listIdToBeRemoved), Value.get(binName));
    }
    

    UDF模块

    function update_record( record, list1, list2, bin_name) 
      local store_list = record[bin_name]
      -- get a list from database record. Create one if it doesn't exits
      if store_list == nil then
        store_list = map()
      end
    
      if list2 then
        for i=1, #list2 do
          map.remove(store_list, list2[i])
        end
      end
    
      if list1 then
        for i=1, #list1 do
          store_list[list1[i]] = 1
        end
      end
    
      if map.size(store_list) == 0 then
        record[bin_name] = nil
      else
        record[bin_name] = store_list
      end
    
      if not aerospike:exists(record) then
        aerospike:create(record)
      else
        aerospike:update(record)
      end 
    end
    

1 个答案:

答案 0 :(得分:1)

代替使用同步Aerospike客户端执行,我开始使用Async Aerospike客户端。现在我能够在~2.6分钟内插入1000万条记录。