在redis.call()

时间:2016-05-21 13:19:21

标签: lua redis

我有一个简单的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

1 个答案:

答案 0 :(得分:2)

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

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

var employeesParent = xDocument.Descendants("Employees").Where(element => element.Parent.Attribute("name").Value == departmentName);
var employees = (from emp in employeesParent.Descendants()
                         select new Employee
                         {
                             DepartmentName = departmentName,
                             FirstName = emp.Attribute("FirstName").Value,
                             Surname = emp.Attribute("Surname").Value
                         }).ToList();

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

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

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

尝试redis.call('SET', KEYS[1], string.gsub(json, '"isViewed":false', '"isViewed":true', 1)) 查看您确实拥有多少返回值。