有一篇关于Redis命令以获取所有可用键的文章,但我想使用Python做到这一点。
有什么办法吗?
采用 scan_iter()
scan_iter()
scan_iter()优于keys()大量密钥,因为它为您提供了可以使用的迭代器,而不是尝试将所有密钥加载到内存中。
keys()
我的redis中有一个1B记录,而且我永远都无法获得足够的内存来一次返回所有密钥。
一对一扫描键
这是一个python代码段,scan_iter()用于从商店中获取与某个模式匹配的所有键,并一一删除它们:
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的密钥),则分批扫描它们将更加高效,如下所示:
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()or keys()方法,该操作都不是原子操作,并且可能会部分失败。
绝对避免在命令行上使用XARGS
我不建议在其他地方重复此示例。对于unicode键,它将失败,并且即使中等数量的键,其速度也非常慢:
redis-cli --raw keys "user:*"| xargs redis-cli del
在此示例中,xargs为每个密钥创建一个新的redis-cli进程!那很糟。
我将这种方法的基准测试结果比第一个python示例慢了4倍,在第一个python示例中,它删除了每个键一次,比批量删除500个要慢20倍。