我试图执行这个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])
答案 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])