Есть ли способы удалить ключи из Redis сразу после доступа к нему?

В соответствии с этим ответом [https://stackoverflow.com/a/17099452/8804776visible[1provided)

«Возможно, вы этого не знаете, но Redis на самом деле однопоточный, поэтому каждая команда гарантированно атомарна. Пока выполняется одна команда, никакая другая команда не запускается».

Redis является однопоточным. Мое требование - хранить ключ в Redis, и как только поток обращается к нему, он должен его удалить.

например: HSET bucket-1 имя Justin

Поток A и B обращаются к одному и тому же ключевому имени HGET bucket-1
Только один поток должен получать данные в любой заданной точке.

Есть ли какие-то особые настройки, которые я могу сделать для этого?


person Justin Mathew    schedule 03.10.2018    source источник


Ответы (2)


Термин «выселение» относится к ключам с установленным сроком действия (TTL). Хотя нет специальной команды для достижения желаемого, вы можете использовать такую ​​транзакцию, как:

WATCH bucket-1
HGET bucket-1 name
(pseudo: if not nil)
MULTI
HDEL bucket-1 name
EXEC

Если EXEC не работает, это означает, что вы находитесь в потоке B (при условии, что A попал туда первым).

В качестве альтернативы, приведенное выше может быть сжато в идиоматический сценарий Lua - как предлагает @The_Dude - например (новые строки добавлены для удобства чтения):

EVAL "local v=redis.call('HGET', KEYS[1], ARGV[1])
      redis.call('HDEL', KEYS[1], ARGS[1])
      return v" 
      1 bucket-1 name

nil ответ означает, что вы Б.

person Itamar Haber    schedule 03.10.2018

Нет команды делать это с хешами. Вы можете использовать сценарий Lua, чтобы справиться с этим.

Вместо этого вы также можете использовать GETSET, где вы можете сбросить ключ до значения, которое означает, что он был использован. другим потребителем.

person TheDude    schedule 03.10.2018
comment
Даже этот ответ также поможет, если я выберу SET вместо HSET. - person Justin Mathew; 04.10.2018