sql >> データベース >  >> NoSQL >> Redis

PythonでRedisデータベースのすべてのキーを取得する

    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倍遅いとベンチマークしました。



    1. $matchが見つからない場合の$addFields

    2. LikeでMongoDBをクエリする方法

    3. $または条件を指定したMongooseのfindメソッドが正しく機能しない

    4. JSON形式の「説明」からオンザフライでMongooseスキーマを定義する