【问题标题】:Lua scripting in redis gives error when using string.gsub as argument in redis.call()在 redis.call() 中使用 string.gsub 作为参数时,redis 中的 Lua 脚本会出错
【发布时间】:2016-05-21 21:35:01
【问题描述】:

我有一个像这样的简单 lua 脚本:

local json = redis.call('GET', KEYS[1])
if json == false then
    return nil
end
local newJson = string.gsub(json, '"isViewed":false', '"isViewed":true', 1)
return redis.call('SET', KEYS[1], newJson)

这按预期工作。

但如果我跳过 newJson 声明并直接进入:

local json = redis.call('GET', KEYS[1])
if json == false then
    return nil
end
return redis.call('SET', KEYS[1], string.gsub(json, '"isViewed":false', '"isViewed":true', 1))

然后我从 Go "Redigo" Redis 客户端收到此错误:

ERR Error running script (call to f_3dc195393616dc1f56a13d6c471e0b68b3e4c8b3): @user_script:5: ERR syntax error

为什么会这样? string.gsub 只是根据此页面返回一个字符串:

https://docs.coronalabs.com/api/library/string/gsub.html

【问题讨论】:

    标签: lua redis


    【解决方案1】:

    在原生 Lua 中 string.gsub 返回 2 个值。也许电晕参考不正确?

    第一个返回值是修改后的字符串。 第二个返回值是发生的匹配数。

    local newJson = string.gsub(json, '"isViewed":false', '"isViewed":true', 1)
    return redis.call('SET', KEYS[1], newJson)
    

    这里你只将第一个返回值传递给 recis.call

    而在以下调用中,您会将两个返回值都传递给 redis.call,这会导致错误。

    redis.call('SET', KEYS[1], string.gsub(json, '"isViewed":false', '"isViewed":true', 1))
    

    试试print(string.gsub(json, '"isViewed":false', '"isViewed":true', 1))看看你有多少返回值。

    【讨论】:

    • 感谢您的帮助!
    • @Alex 你仍然可以直接传递结果而不用创建newJson 调用redis.call('SET', KEYS[1], string.gsub(json, '"isViewed":false', '"isViewed":true', 1), nil)
    • 最后的 nil 是什么?
    • @Alex 对我来说没有意义。应该不会影响您的通话。
    猜你喜欢
    • 2021-04-15
    • 2017-06-26
    • 2013-09-29
    • 2023-02-23
    • 2017-05-23
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多