为什么我一直收到这个错误“从Lua脚本调用Redis命令的args数量错误”,即使我得到了所需的输出

时间:2015-06-23 14:59:54

标签: python lua redis

我试图执行这个lua脚本,我也得到了正确的输出。但我一直在错误的args数量调用Redis命令来自Lua脚本

def new_get_following(self, start, count, user_id=0):
        script = """
        local envs = redis.call('zrevrange',KEYS[1],ARGV[3],ARGV[4]);
        redis.call('sadd',ARGV[1],unpack(envs));
        local favs = redis.call('sinter',ARGV[2],ARGV[1]);
        local acts= redis.call('mget',unpack(envs));
        redis.call('del',ARGV[1]);
        return {favs,envs,acts}
        """
        count = int(start) + int(count) - 1
        print count
        fav_key = self.fav_key + ":" + str(user_id)
        following_stream_key = self.following_stream_key + ":" + str(user_id)
        tmp_key = int(time.time())
        return self.exectute(script, args=[tmp_key, fav_key, start, count], keys=[following_stream_key])

2 个答案:

答案 0 :(得分:0)

也许这只是一个错字并且已经得到纠正但是:

self.exectute不应该是self.execute

答案 1 :(得分:0)

在代码的最后一行导致错误。 升

local envs = redis.call('zrevrange',KEYS[1],ARGV[3],ARGV[4]);
local acts= redis.call('mget',unpack(envs));

好像envs是空表然后第二个l ine local acts = redis.call('mget',unpack(envs)); 变成这个 local acts = redis.call(' MGET”,解包()); 所以lua不断抛出错误。为了避免这个错误,我们可以使用redis.pacall,它给出了可以在输出中检查的Responnse错误对象可以处理错误。所以最终的代码应该是

def new_get_following(self, start, count, user_id=0):
        script = """
        local envs = redis.call('zrevrange',KEYS[1],ARGV[3],ARGV[4]);
        redis.call('sadd',ARGV[1],unpack(envs));
        local favs = redis.call('sinter',ARGV[2],ARGV[1]);
        local acts= redis.pcall('mget',unpack(envs));
        redis.call('del',ARGV[1]);
        return {favs,envs,acts}
        """
        count = int(start) + int(count) - 1
        print count
        fav_key = self.fav_key + ":" + str(user_id)
        following_stream_key = self.following_stream_key + ":" + str(user_id)
        tmp_key = int(time.time())
        return self.exectute(script, args=[tmp_key, fav_key, start, count], keys=[following_stream_key])