Get all keys in Redis database with python
有一篇关于Redis命令以获取所有可用键的文章,但我想使用Python做到这一点。
有什么办法吗?
使用
对于大量密钥,
我的redis中有一个1B记录,而且我永远都无法获得足够的内存来一次返回所有密钥。
一对一扫描键
这是一个使用
1 2 3 4 5 | import redis r = redis.StrictRedis(host='localhost', port=6379, db=0) for key in r.scan_iter("user:*"): # delete the key r.delete(key) |
批量扫描
如果要扫描的键列表非常大(例如,大于100k的键),则分批扫描它们将更加高效,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import redis from itertools import izip_longest r = redis.StrictRedis(host='localhost', port=6379, db=0) # iterate a list in batches of size n def batcher(iterable, n): args = [iter(iterable)] * n return izip_longest(*args) # in batches of 500 delete keys matching user:* for keybatch in batcher(r.scan_iter('user:*'),500): r.delete(*keybatch) |
我对该脚本进行了基准测试,发现使用500个批处理的大小比一对一扫描密钥快5倍。我测试了不同的批次大小(3,50,500,1000,5000),发现500的批次大小似乎是最佳的。
请注意,无论使用
绝对避免在命令行上使用XAGS
我不建议在其他地方重复此示例。对于unicode键,它将失败,对于中等数量的键,它也会非常慢:
1 | redis-cli --raw keys"user:*"| xargs redis-cli del |
在此示例中,xargs为每个密钥创建一个新的redis-cli进程!那很糟。
我对这种方法进行了基准测试,它比第一个python示例慢4倍,在该示例中,它逐个删除每个键,并且比500个批次中的删除慢20倍。
是的,使用StrictRedis模块中的
1 2 3 | >>> import redis >>> r = redis.StrictRedis(host=YOUR_HOST, port=YOUR_PORT, db=YOUR_DB) >>> r.keys() |
提供空模式将获取所有这些模式。按照链接的页面:
keys(pattern='*')
Returns a list of keys matching pattern
1 2 3 4 | import redis r = redis.Redis("localhost", 6379) for key in r.scan_iter(): print key |
使用Pyredis库
扫描命令
自2.8.0起可用。
时间复杂度:每次通话O(1)。 O(N)表示完整的迭代,包括足够的命令调用,以使光标返回到0。N是集合内元素的数量。