如何获取列表然后从aerospike Java cilent单个事务中修改List类型的bin

时间:2016-03-03 08:41:05

标签: java aerospike

我想从aerospike数据库中获取类型列表的bin并更新列表(从列表中添加和删除一些元素)然后在给定密钥的单个气动数据库中更新bin。我有多个线程可以从多个地方获取和更新相同的密钥,所以我想在单个事务中执行上述操作。

aerospike java客户端版本:** 3.2.0 **** ** java版本:1.8

1 个答案:

答案 0 :(得分:2)

如果您正在进行简单的列表操作,则可以使用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