Атомное чтение и удаление из Redis с использованием StackExchange.Redis

Есть ли простой способ атомарно прочитать значение, а затем удалить его из Redis с помощью драйвера StackExchange c#?
Я буферизую элементы в Redis, и когда они достигают определенного порога, я извлекаю их, но я также хочу очистить свой буфер . Я должен упомянуть, что я храню элементы в списке, и под «очисткой буфера» я имею в виду, что хочу удалить список.
«key»: [список элементов]


person Ben    schedule 16.11.2016    source источник
comment
Обернуть его в транзакцию?   -  person apokryfos    schedule 16.11.2016
comment
rediscookbook.org/get_and_delete.html также должен работать со StackExchange.Redis.   -  person Christian.K    schedule 16.11.2016
comment
@apokryfos Точно! Хорошая точка зрения! Спасибо!   -  person Ben    schedule 16.11.2016
comment
@Christian.K Я читал это, но мне было интересно, есть ли готовый метод или что-то в API (поскольку официально прошло несколько часов, я работаю с драйвером StackExchange и Redis, если на то пошло).   -  person Ben    schedule 16.11.2016


Ответы (1)


Вы можете создать транзакцию и выполнить GET/DEL атомарно, например:

var db = connectionMultiplexer.GetDatabase();
var tran = db.CreateTransaction();
var getResult = tran.StringGetAsync(key);
tran.KeyDeleteAsync(key);
tran.Execute();
var value = getResult.Result;

Это отправит следующие команды в Redis:

MULTI
GET "key"
DEL "key"
EXEC
person thepirat000    schedule 16.11.2016
comment
Если ваш ключ представляет собой список, вам, вероятно, следует изменить вызов на tran.ListRangeAsync - person thepirat000; 16.11.2016
comment
Это именно то, что я должен сделать! - person Ben; 16.11.2016
comment
@ thepirat000, если несколько приложений (или одно и то же приложение на нескольких серверах) отправляют этот запрос в Redis. Будет ли этот код гарантировать, что только один будет успешным? - person adinas; 12.10.2020