通过Lua从redis获取与键模式匹配的所有值

4
我试图使用py-redis和lua找到所有匹配特定模式的键及其值,以下是我的代码。
rc = redis.Redis(..)

rc.set('google:',100)
rc.set('google:3',200)
rc.set('google:2',3400)
rc.set('google',200)
rc.set('fb',300)


get_script = """
local value = redis.call('GET', KEYS[1])
return value
"""
get_values = rc.register_script(get_script)

print get_values(rc.keys(pattern='google:*'))

print get_values(keys=['google:'])
print get_values(keys=['google:*'])

我收到的输出是:
100
100
None

首先,我不明白为什么最后一个打印语句返回的是None。我的初衷是获取所有与模式匹配的键(及其值),但我只得到了第一个键。


也许需要一个正则表达式。尝试使用 google:.* - Ionut Hulub
这给了我以下错误ResponseError:@user_script:2:Lua redis()命令参数必须是字符串或整数。 - MARK
1个回答

3

我认为我找到了我所缺少的东西

在初始redis.call中,我应该将KEYS作为第一个参数传递而不是GET,然后遍历这些键以获取值

get_script = """
local keys = (redis.call('keys', ARGV[1]))
local values={}  

for i,key in ipairs(keys) do 
    local val = redis.call('GET', key)
    values[i]=val
    i=i+1
end

return values
"""
get_values = rc.register_script(get_script)

print get_values(args=['google:*'])

3
这是正确的答案,然而,使用KEYS可能是在Redis中最糟糕的事情。在我看来,题目提出者需要重新考虑他的方法。 - Itamar Haber
请查看SCAN,它是用于搜索/匹配键的:http://redis.io/commands/scan - elithrar
3
如果您能演示如何使用扫描来解决他的问题,那么您会更有用。 - Timothy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接