Reputation: 395
I trying to execute this lua script i get proper output too. But i keep getting Wrong number of args calling Redis command From Lua script
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])
Upvotes: 3
Views: 6352
Reputation: 395
In the code last line is causing error.
local envs = redis.call('zrevrange',KEYS[1],ARGV[3],ARGV[4]);
local acts= redis.call('mget',unpack(envs));
As if envs is empty table then second line:
local acts= redis.call('mget',unpack(envs));
becomes this:
local acts= redis.call('mget',unpack());
so lua keeps throwing error. For avoid this error we can use redis.pacall
which gives Response error object which can be checked in output can handle error. So final code should be
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])
Upvotes: 1
Reputation: 1124
Maybe it is just a typo and has already been corrected but:
self.exectute
shouldn't it be self.execute
?
Upvotes: 2