Как получить список, а затем изменить 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