Как сделать HSET, только если ключ существует с Redis? - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу выполнить команду HSET, но только если ключ существует.Похоже на HSETNX, за исключением exists вместо not exists

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

HSET, если ключ существует

Кроме того,после прочтения о WATCH, что касается меня, потому что я не хочу прерывать транзакцию, если приходит другой запрос.

Я в основном пытаюсь выполнить HGETALL и сразу после того, как выдает вторую команду для HSET, говоря, что она была прочитана один раз.

После этого я хочу, чтобы все последующие запросы знали, чтоон уже прочитан.

Проблема в том, что когда я вызываю HSET для ключа, который не существует, вместо простого сбоя он создает новую запись в базе данных redis, которая мне не нужна.Я хочу, чтобы он обновлял записи только в том случае, если он существует, без необходимости проверять, существует ли он вначале

В соответствии с этим этот метод все равно не будет работать для высокой конкуренции (будет много запросов к ключу)

https://github.com/antirez/redis/issues/441

Там написано, что я мог бы как-то использовать скрипты, но я не уверен

1 Ответ

0 голосов
/ 04 декабря 2018

Да.Вы можете выполнить скрипт lua в Redis, введя команду EVAL.Все команды после EVAL будут заблокированы до завершения EVAL, поскольку Redis является однопоточным сервером.

В документации говорится:

EVAL и EVALSHAиспользуются для оценки сценариев с использованием интерпретатора Lua, встроенного в Redis, начиная с версии 2.6.0.

Таким образом, легко реализовать простую команду HSETX ,, просто запустите сценарий lua ниже: eval "if redis.call('exists',KEYS[1]) == 1 then redis.call('hset', KEYS[1], ARGV[1], 0) end" 1 test_key test_field

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...