【问题标题】:How to push only if list is empty in one Redis transaction?仅当一个 Redis 事务中的列表为空时如何推送?
【发布时间】:2020-04-09 20:53:30
【问题描述】:

我正在尝试做一个小队列。我需要弹出队列/列表中的第一个值,否则推送一个新值。可以在一笔交易中完成吗?我尝试使用 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"

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

【问题讨论】:

    标签: javascript node.js database list redis


    【解决方案1】:

    您可以为此使用 lua 脚本,查看 redis 文档了解更多信息。

    如果找到结果返回元素,下面的 lua 脚本调用 lpop,否则它将使用 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
    

    【讨论】:

    • 我想没有脚本没有其他方法可以做到这一点。我对 Lua 不太熟悉,所以我试图避免它。谢谢你的例子,它有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多