Как сказал @ 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>