Есть ли простой способ атомарно прочитать значение, а затем удалить его из Redis с помощью драйвера StackExchange c#?
Я буферизую элементы в Redis, и когда они достигают определенного порога, я извлекаю их, но я также хочу очистить свой буфер . Я должен упомянуть, что я храню элементы в списке, и под «очисткой буфера» я имею в виду, что хочу удалить список.
«key»: [список элементов]
Атомное чтение и удаление из Redis с использованием StackExchange.Redis
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
Если ваш ключ представляет собой список, вам, вероятно, следует изменить вызов на
tran.ListRangeAsync
- person thepirat000; 16.11.2016
Это именно то, что я должен сделать!
- person Ben; 16.11.2016
@ thepirat000, если несколько приложений (или одно и то же приложение на нескольких серверах) отправляют этот запрос в Redis. Будет ли этот код гарантировать, что только один будет успешным?
- person adinas; 12.10.2020