Не знаете, как запустить фрагмент кода CAS (сравнить и поменять) со страницы документации Redis - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь запустить код со страницы redis транзакций . В частности, эта часть:

WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC

Если я пытаюсь сделать это из cli, строка за строкой, я получаю это:

localhost:6380> zadd set 1 a
(integer) 1
localhost:6380> WATCH zset
localhost:6380> element = ZRANGE zset 0 0
(error) ERR unknown command 'element'
OK

, что, вероятно, означает, что я делаю что-то не так ? Я помню, как работал с lua около 9 лет go, так что на самом деле это тоже не похоже на lua.

Как кто-то запускает этот фрагмент? Это только какой-то псевдокод?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Как сказал @ Dinei , приведенный пример - псевдокод.

Давайте посмотрим на это (я добавил номера строк, к которым мы будем обращаться):

1 WATCH zset
2 element = ZRANGE zset 0 0
3 MULTI
4 ZREM zset element
5 EXEC

Задача упражнения - решить условие гонки, которое возникнет, если мы только прочитаем ключ (с ZRANGE, в строке 2), а затем изменим ключ (с ZREM в строке 4). Я предполагаю, что вы понимаете проблему, если мы не использовали семантику "CAS", поэтому нет необходимости разбираться с ней.

Как указывалось, redis-cli просто дает вам возможность запускать команды redis и видеть их ответы, но не сохранять значения в переменных, и т. д. c.

Таким образом, идея примера заключается в том, что в строке 2 мы «сохраняем» результат операции «чтения» в псевдопеременная element.

Затем в строке 4 мы используем это значение в нашей операции "set", и, конечно, строки 1, 3 и 5 только команды "CAS", чтобы гарантировать отсутствие условия гонки.

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

Но если вы захотите запустить его в redis-cli, вы увидите это, где мы делаем вид, что наш код на стороне клиента прочитал бы и сохранил "a", который был возвращен с zrange и затем прошел d это значение для команды zrem:

127.0.0.1:6379> zadd zset 1 a
(integer) 1
127.0.0.1:6379> watch zset
OK
127.0.0.1:6379> zrange zset 0 0
1) "a"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> zrem zset a
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
127.0.0.1:6379>
0 голосов
/ 19 апреля 2020

Да, это какой-то псевдокод.

redis-cli принимает только команды Redis, не является полноценным редактором и не поддерживает прямые сценарии Lua (не такие переменные, как переменная element). в псевдокоде).

Я помню, как работал с lua около 9 лет go, так что на самом деле это не похоже на lua для меня.

Это не Lua, это псевдокод. На самом деле, страница Redis Транзакции , на которую вы ссылались, вовсе не ссылается на Lua (и именно поэтому @ комментарий Пятачка в вашем посте имеет смысл).

Однако можно выполнить сценарии Lua, используя команду Redis 'EVAL.

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