我想从aerospike数据库中获取类型列表的bin并更新列表(从列表中添加和删除一些元素)然后在给定密钥的单个气动数据库中更新bin。我有多个线程可以从多个地方获取和更新相同的密钥,所以我想在单个事务中执行上述操作。
aerospike java客户端版本:** 3.2.0 **** ** java版本:1.8
答案 0 :(得分:2)
如果您正在进行简单的列表操作,则可以使用ListOperation
:
https://www.aerospike.com/apidocs/java/com/aerospike/client/cdt/ListOperation.html
如果ListOperation
没有您需要进行的操作,或者您需要在一个原子事务中进行多个操作,那么使用UDF是您的最佳选择。
在UDF执行期间,记录被锁定。无论是完全锁定还是写锁定,我都不确定,但任何一种情况都应该满足您的原子性需求。执行所有列表操作,然后在一次aerospike:create(rec)
或aerospike:update(rec)
调用中将更改保留到数据库。
示例:most_recent_10_list.lua
function append(rec, value)
-- Get list from database record. Create one if it doesn't exist.
local my_list = rec["my_list_bin"]
if my_list == nil then
my_list = list()
end
-- Add value to list
list.append(my_list, value)
-- Keep only the 10 most-recent values in the list
local new_list_size = list.size(my_list)
if list.size(new_list_size >= 10) then
my_list = list.drop(my_list, new_list_size - 10)
end
-- Save changes to database
rec["my_list_bin"] = my_list
if not aerospike:exists(rec) then
aerospike:create(rec)
else
aerospike:update(rec)
end
end