Aerospike花了将近70分钟来插入1000万个关键值。我要遵循的步骤是:
我在内存中拥有所有键值
在aerospike服务器上注册aerospike udf
开始为java代码迭代1000万次,并为每个键和值调用aerospike udf模块。
在udf中,我正在检查密钥是否已经存在。如果是,则更新否则插入。
我有2个具有复制因子2的aerospike服务器。
有没有办法提高写入性能或执行批量写入。我知道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
答案 0 :(得分:1)
代替使用同步Aerospike客户端执行,我开始使用Async Aerospike客户端。现在我能够在~2.6分钟内插入1000万条记录。