Aerospike插入1000万个键值几乎需要70分钟。我按照以下步骤插入:
-
我在内存中有所有密钥值
-
在Aeropike服务器上注册Aeropike udf
-
开始为java代码迭代1000万次,并为每个键和值调用aerospike udf模块。
-
在udf内部,我正在检查密钥是否已经存在。如果是,则更新,否则插入。
-
我有2个复制因子为2的Aeropike服务器。
是否有任何方法可以提高写入性能或执行批处理写入。我知道Aeropike不支持批量写入。对优化写入操作的任何建议。
我使用的代码
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
我开始使用Async Aerospike客户端,而不是使用sync Aerospike客户机执行。现在我可以在2.6分钟内插入1000万条记录。