我正在尝试找出存储在与redis中的模式匹配的键列表中的值。我尝试使用SCAN,以便稍后可以使用MGET获取所有值,问题是:
SCAN 0 MATCH "foo:bar:*" COUNT 1000不返回任何值,而
SCAN 0 MATCH "foo:bar:*" COUNT 10000返回所需的键。如何强制SCAN查看所有现有的密钥?我非得调查lua才行吗?
发布于 2015-10-16 18:02:28
使用下面的代码,您将从光标0开始扫描1000个第一个对象
SCAN 0 MATCH "foo:bar:*" COUNT 1000 因此,您将获得一个要调用新游标
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
然后调用
SCAN 0 MATCH "foo:bar:*" COUNT YOUR_AMOUNT_OF_KEYS发布于 2016-09-09 14:38:13
对于任何对如何使用python redis库感兴趣的人来说,我只想把它放在这里:
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都会返回一个元组。
示例:
(cursor, results_list)
(5433L, [... keys here ...])
(3244L, [... keys here, maybe ...])
(6543L, [... keys here, duplicates maybe too ...])
(0L, [... last items here ...])如果扫描在scans.
results_list,就像@Josh在评论中指出的那样,继续扫描SCAN直到它返回到0.
cursor,不保证SCAN在同时发生插入的竞争条件下终止。我花了很长时间才弄清楚光标的数字是多少,为什么我会随机得到一个空的列表,或者重复的项目,但即使我知道我只是放了一些项目。
阅读后:
这更有意义,但仍然有一些深层的编程魔法和妥协发生,以迭代集。
发布于 2019-12-18 00:08:58
提醒一下,如果您在redis python库上使用scan_iter方法,这是一项微不足道的任务:
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脚本在循环的每次迭代中都会产生一个新的客户端。
https://stackoverflow.com/questions/33166812
复制相似问题