如何从 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

如果你正在做简单的列表操作,你可以使用ListOperationhttps://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