使用python获取Redis数据库中的所有键

Get all keys in Redis database with python

有一篇关于Redis命令以获取所有可用键的文章,但我想使用Python做到这一点。

有什么办法吗?


使用scan_iter()

对于大量密钥,scan_iter()优于keys(),因为它为您提供了可以使用的迭代器,而不是尝试将所有密钥加载到内存中。

我的redis中有一个1B记录,而且我永远都无法获得足够的内存来一次返回所有密钥。

一对一扫描键

这是一个使用scan_iter()的python代码段,以从商店中获取与某个模式匹配的所有键,并一一删除它们:

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的批次大小似乎是最佳的。

请注意,无论使用scan_iter()还是keys()方法,该操作都不是原子的,并且可能会部分失败。

绝对避免在命令行上使用XAGS

我不建议在其他地方重复此示例。对于unicode键,它将失败,对于中等数量的键,它也会非常慢:

1
redis-cli --raw keys"user:*"| xargs redis-cli del

在此示例中,xargs为每个密钥创建一个新的redis-cli进程!那很糟。

我对这种方法进行了基准测试,它比第一个python示例慢4倍,在该示例中,它逐个删除每个键,并且比500个批次中的删除慢20倍。


是的,使用StrictRedis模块中的keys()

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是集合内元素的数量。