scan_iter()
を使用します
scan_iter()
keys()
よりも優れています 多数のキーの場合、すべてのキーをメモリにロードしようとするのではなく、使用できるイテレータが提供されるためです。
redisに1Bレコードがあり、すべてのキーを一度に返すのに十分なメモリを取得できませんでした。
キーを1つずつスキャンする
これは、scan_iter()
を使用したPythonスニペットです。 パターンに一致するストアからすべてのキーを取得し、それらを1つずつ削除するには:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
# delete the key
r.delete(key)
バッチでのスキャン
スキャンするキーのリストが非常に多い場合(たとえば、10万を超えるキーがある場合)、次のようにバッチでスキャンする方が効率的です。
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のバッチサイズを使用すると、キーを1つずつスキャンするよりも5倍高速であることがわかりました。さまざまなバッチサイズ(3,50,500,1000,5000)をテストしたところ、500のバッチサイズが最適であることがわかりました。
scan_iter()
を使用するかどうかに注意してください またはkeys()
メソッドの場合、操作はアトミックではなく、途中で失敗する可能性があります。
コマンドラインでXARGSを使用することは絶対に避けてください
他の場所で繰り返されているこの例はお勧めしません。 Unicodeキーでは失敗し、適度な数のキーでも非常に遅くなります:
redis-cli --raw keys "user:*"| xargs redis-cli del
この例では、xargsはすべてのキーに対して新しいredis-cliプロセスを作成します!それは悪いことです。
このアプローチは、すべてのキーを1つずつ削除する最初のPythonの例よりも4倍遅く、500のバッチで削除するよりも20倍遅いとベンチマークしました。