为什么我一直在得到这个错误信息“调用Redis命令从Lua脚本时参数数量错误”,即使我得到了期望的输出。

当我尝试执行这个Lua脚本时,我得到了正确的输出。但是我一直收到错误的参数数量调用Redis命令来自Lua脚本

点赞
用户44740
用户44740

或许这只是一个拼写错误并且已经被改正了,但是:

self.exectute 应该改为 self.execute

2015-06-23 17:07:24
用户4865242
用户4865242

在代码中,最后一行引起了错误。

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

如果envs是一个空的表格,则第二行:

local acts= redis.call('mget',unpack(envs));

变成了这个:

local acts= redis.call('mget',unpack());

因此,lua会继续抛出错误。为了避免这个错误,我们可以使用redis.pacall,它会给出一个响应错误对象,可以在输出中检查并处理错误。因此,最终代码应该是这样的:

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])
2015-06-25 14:43:20