Как сделать sh, только если список пуст в одной транзакции Redis? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь сделать небольшую очередь. Мне нужно вытолкнуть первое значение в очередь / список, иначе pu sh новое значение. Можно ли это сделать за одну транзакцию? Я попытался использовать 2 запроса: LPOP и отправить LPUSH, если LPOP ничего не возвращает. Но это не работает, поскольку MONITOR отображает:

"lpop" "ns:queue"
"lpop" "ns:queue" 
"lpop" "ns:queue"

"rpush" "ns:queue" "1"
"rpush" "ns:queue" "2"
"rpush" "ns:queue" "3"

Asyn c делает свое дело. В конце все 3 соединения будут в очереди, а не только одно. Я считаю, что MULTI не работает с условными утверждениями.

1 Ответ

3 голосов
/ 10 апреля 2020

Для этого можно использовать скрипт lua, для получения дополнительной информации проверьте документы redis.

В приведенном ниже скрипте lua вызывается lpop, если найденный результат возвращает элемент, иначе он получит данные sh с использованием lpu. sh. Надеюсь, что это отвечает на вопрос.

eval "local v = redis.call('lpop', KEYS[1]); if not v then return redis.call('lpush', KEYS[1], ARGV[1]); else return v; end;" 1 "ns:queue" 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...