如何通过前缀的数字范围获取所有Redis密钥

时间:2019-12-03 12:45:42

标签: regex redis prefix redis-cli

我需要按62-125范围内的前缀获取所有键,后跟':'

我尝试运行以下命令没有成功:

res = r.keys('[62-125]:*')

还尝试使用扫描:

iter = r.scan_iter('^(6[2-9]|7[0-9]):*')
res = []

for key in iter:
    res.append(key)

这甚至可能吗?如果是,怎么办?

一些例子,如果不清楚:

应检索的密钥:

62:kk:345345345
72:hg:76576
88:fg:67886
122:hg:8678
124:gg:8678

不应检索的密钥:

0:df:09765
20:gg:6565
38:hh:345
44:bb:3454
61:bb:6568

我的数据库中的所有键都以数字前缀开头,如果有关系,则后跟':'。

3 个答案:

答案 0 :(得分:1)

Redis的模式(用于KEYSSCAN)类似于glob,因此尝试对它们使用正则表达式是不可行的。

您可以使用执行完整的SCAN并过滤结果的服务器端Lua脚本(Lua具有更强大的模式匹配功能,尽管不是POSIX regex)。

有关示例,请参见https://stackoverflow.com/a/29945372/3160475

答案 1 :(得分:0)

可行的解决方案:

RES = []

_res = r.keys('6[2-9]:*')
RES.append(_res)

for i in range(7,13):
    _res = r.keys('{}[0-9]:*'.format(i))
    RES.append(_res)

这可行,但是我不接受这个答案。

  1. 令人恶心,使我自我厌恶
  2. 根本没有效率

如果可能的话,我将投票反对自己的解决方案。请提出一个更好的建议。

答案 2 :(得分:0)

我建议您使用REDIS PIPELINE

喜欢这个...

Pipeline pipelined = jedis.pipelined();
for(keys : 62-125){
      pipelined.keys("keys*");
}
pipelined.sync();
for(Reponse response : responses){
      Object o = response.get(); //Here you get the list of keys
}

您不能使用KEYSSCAN来获取多个匹配模式的键。有关更多information的信息请参见