首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据前缀的编号范围获取所有redis key

如何根据前缀的编号范围获取所有redis key
EN

Stack Overflow用户
提问于 2019-12-03 20:45:42
回答 3查看 1K关注 0票数 0

我需要通过62-125范围内的前缀和后跟':‘来获取所有的键。

Iv'e尝试运行以下命令,但没有成功:

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

还尝试使用扫描:

代码语言:javascript
复制
iter = r.scan_iter('^(6[2-9]|7[0-9]):*')
res = []

for key in iter:
    res.append(key)

这有可能吗?如果是,是如何实现的?

下面是一些不清楚的例子:

应检索的密钥:

代码语言:javascript
复制
62:kk:345345345
72:hg:76576
88:fg:67886
122:hg:8678
124:gg:8678

不应检索的密钥:

代码语言:javascript
复制
0:df:09765
20:gg:6565
38:hh:345
44:bb:3454
61:bb:6568

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

EN

回答 3

Stack Overflow用户

发布于 2019-12-03 22:03:11

Redis的模式(用于KEYSSCAN)类似于glob,所以尝试在它们上使用正则表达式是不可能的。

您可以使用服务器端Lua脚本( Lua具有更健壮的模式匹配功能,但不是POSIX正则表达式)来执行完整的SCAN并过滤结果。

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

票数 1
EN

Stack Overflow用户

发布于 2019-12-03 21:07:00

一个可行的解决方案:

代码语言:javascript
复制
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)

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

这很恶心,让我讨厌

  • ,它根本就没有效率

如果可能的话,我会投票反对我自己的解决方案。请推荐一个更好的。

票数 0
EN

Stack Overflow用户

发布于 2019-12-03 21:22:43

我建议您使用REDIS PIPELINE

像这样..。

代码语言:javascript
复制
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来获取多个匹配的密钥,这是pattern.Refer more information

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59157474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档