首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis scan count:如何强制SCAN返回所有匹配模式的key?

Redis scan count:如何强制SCAN返回所有匹配模式的key?
EN

Stack Overflow用户
提问于 2015-10-16 17:23:32
回答 3查看 56.6K关注 0票数 39

我正在尝试找出存储在与redis中的模式匹配的键列表中的值。我尝试使用SCAN,以便稍后可以使用MGET获取所有值,问题是:

代码语言:javascript
复制
SCAN 0 MATCH "foo:bar:*" COUNT 1000

不返回任何值,而

代码语言:javascript
复制
SCAN 0 MATCH "foo:bar:*" COUNT 10000

返回所需的键。如何强制SCAN查看所有现有的密钥?我非得调查lua才行吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-16 18:02:28

使用下面的代码,您将从光标0开始扫描1000个第一个对象

代码语言:javascript
复制
SCAN 0 MATCH "foo:bar:*" COUNT 1000 

因此,您将获得一个要调用新游标

代码语言:javascript
复制
SCAN YOUR_NEW_CURSOR MATCH "foo:bar:*" COUNT 1000

扫描1000个下一个物体。然后,当您将COUNT从1000增加到10000并检索数据时,您将扫描更多的键,然后在本例中匹配更多的键。

要扫描整个列表,您需要调用SCAN,直到游标返回0(即整个扫描)

使用INFO命令获取密钥的数量,如下所示

db0:keys=YOUR_AMOUNT_OF_KEYS,expires=0,avg_ttl=0

然后调用

代码语言:javascript
复制
SCAN 0 MATCH "foo:bar:*" COUNT YOUR_AMOUNT_OF_KEYS
票数 38
EN

Stack Overflow用户

发布于 2016-09-09 14:38:13

对于任何对如何使用python redis库感兴趣的人来说,我只想把它放在这里:

代码语言:javascript
复制
import redis
redis_server = redis.StrictRedis(host=settings.redis_ip, port=6379, db=0)
mid_results = []
cur, results = redis_server.scan(0,'foo:bar:*',1000)
mid_results += results

while cur != 0:
    cur, results = redis_server.scan(cur,'foo:bar:*',1000)
    mid_results += results

final_uniq_results = set(mid_results)

我花了几天时间才弄清楚,但基本上每个scan都会返回一个元组。

示例:

代码语言:javascript
复制
(cursor, results_list)

(5433L, [... keys here ...])
(3244L, [... keys here, maybe ...])
(6543L, [... keys here, duplicates maybe too ...])
(0L, [... last items here ...])

如果扫描在scans.

  • However,之间返回一个空的results_list,就像@Josh在评论中指出的那样,继续扫描SCAN直到它返回到0.

  • Even是保证它将返回到cursor,不保证SCAN在同时发生插入的竞争条件下终止。

我花了很长时间才弄清楚光标的数字是多少,为什么我会随机得到一个空的列表,或者重复的项目,但即使我知道我只是放了一些项目。

阅读后:

这更有意义,但仍然有一些深层的编程魔法和妥协发生,以迭代集。

票数 26
EN

Stack Overflow用户

发布于 2019-12-18 00:08:58

提醒一下,如果您在redis python库上使用scan_iter方法,这是一项微不足道的任务:

代码语言:javascript
复制
from redis import StrictRedis

redis = StrictRedis.from_url(REDIS_URI)

keys = []
for key in redis.scan_iter('foo:bar:*', 1000):
    keys.append(key)

最后,keys将包含您将通过应用@khanou的方法获得的所有密钥。

这也比使用shell脚本更有效,因为shell脚本在循环的每次迭代中都会产生一个新的客户端。

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

https://stackoverflow.com/questions/33166812

复制
相关文章

相似问题

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