如何仅在一个redis事务中列表为空时推送?

ie3xauqp  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(354)

我想排一小队。我需要弹出队列/列表中的第一个值,否则就推一个新值。它能在一次交易中完成吗?我尝试使用两个请求:lpop和send lpush。
如果lpop没有返回任何东西。但它不起作用,监视器显示:

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

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

async正在做它的生意。最后,所有3个连接都将在队列中,而不是只有一个连接。我相信multi不适用于条件语句。

b91juud3

b91juud31#

您可以使用lua脚本来实现这一点,有关更多信息,请查看redis文档。
下面的lua脚本调用lpop if result found返回元素,否则它将使用lpush推送数据。希望这能回答问题。

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

相关问题