lua脚本返回假,给出错误“redis:评估期间”无

pn9klfpd  于 2023-02-11  发布在  Redis
关注(0)|答案(1)|浏览(146)

我写了一个小例子来解释我所面临的问题:

func (rc *redisClient) runDummyScript(ctx context.Context) bool {
    scriptSha, err := rc.ScriptLoad(ctx, dummyScript).Result()
    if err != nil {
        return false
    }

    rs, err := rc.EvalSha(ctx, scriptSha, []string{}).Result()
    if err != nil {
        fmt.Print("could not execute the redis commands for ", err)
    }
    ans, _ := rs.(bool)
    return ans
}

const dummyScript = `return false`

对于脚本返回true的情况,上面的方法runDummyScript不会给出任何错误,但是对于脚本返回false的情况,这会给我一个错误"redis: nil"
我认为这是因为lua脚本将false转换为nil,因此EvalSha将脚本返回的nil视为错误,这在我看来很奇怪。
为了解决这个问题,我必须忽略"redis: nil"错误,这对我来说又是一个奇怪的问题,但是lua脚本返回布尔值似乎是一个很常见的操作,写一个解决方案对我来说似乎不是一个好的选择。
我很想知道如何使它正常工作。
谢谢!

xlpyo6sf

xlpyo6sf1#

我认为这是因为lua脚本将false转换为nil,因此EvalSha将脚本返回的nil视为错误,这在我看来很奇怪。
不- Redis会这么做。
使用Lua,您可以返回任意多的值/数据类型。
但是Redis似乎只处理数字(整数?)和字符串以及(EDIT)表DT。
一个简单的测试...

€ redis-cli 
127.0.0.1:6379> eval 'return(true)' 0
(integer) 1
127.0.0.1:6379> eval 'return(false)' 0
(nil)
127.0.0.1:6379> eval 'return {1, 2.5, 3.14159265, true, false}' 0
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) (integer) 1
5) (nil)
127.0.0.1:6379> eval 'return {1, "2.5", "3.14159265", "true", "false"}' 0
1) (integer) 1
2) "2.5"
3) "3.14159265"
4) "true"
5) "false"

现在纯Lua(5.1)

€ /bin/lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
2.5
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
true
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
true
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
false
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
1
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
2.5
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
true
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
2.5
> return(table.remove({1, 2.5, 3.14159265, true, false}, math.random(1, 5)))
3.14159265

相关问题