Как получить список, а затем изменить bin типа List в одной транзакции из аэроспайк Java cilent

Я хочу извлечь список типов из базы данных aerospike и обновить список (добавить и удалить некоторые элементы из списка), а затем обновить bin в aerospike db в отдельности для данного ключа. У меня есть несколько потоков, которые могут получать и обновлять один и тот же ключ из нескольких мест, поэтому я хочу выполнить вышеуказанную операцию в одной транзакции.

Ява-клиент aerospike: **3.2.0**** ** Ява-версия: 1.8

1 ответ

Решение

Если вы делаете простые манипуляции со списком, вы можете использовать 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
Другие вопросы по тегам