如何从 aerospike Java cilent 的单个事务中获取列表然后修改列表类型的 bin
How to fetch list then modify bin of type List in single transaction from aerospike Java cilent
我想从 aerospike 数据库中获取列表类型的 bin 并更新列表(从列表中添加和删除一些元素),然后针对给定的键更新 aerospike 数据库中的 bin。我有多个线程可以从多个地方获取和更新相同的密钥,所以我想在单个事务中执行上述操作。
aerospike java客户端版本:**3.2.0****
**java 版本:1.8
如果你正在做简单的列表操作,你可以使用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
我想从 aerospike 数据库中获取列表类型的 bin 并更新列表(从列表中添加和删除一些元素),然后针对给定的键更新 aerospike 数据库中的 bin。我有多个线程可以从多个地方获取和更新相同的密钥,所以我想在单个事务中执行上述操作。
aerospike java客户端版本:**3.2.0**** **java 版本:1.8
如果你正在做简单的列表操作,你可以使用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