Есть ли способы выселить ключи из Redis сразу после доступа к нему? - PullRequest
0 голосов
/ 03 октября 2018

Согласно этому ответу [https://stackoverflow.com/a/17099452/8804776][1]

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

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

например: HSET bucket-1 name justin

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

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

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Термин «выселение» относится к ключам с установленным сроком действия (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

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

0 голосов
/ 03 октября 2018

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

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

...