地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Redis】scanの話と計算量

Redisで有名なKEYSは、特定のパターンにマッチするKeyを検索する手法。このコマンド自体はO(N)の計算量でありデータ数が多いとその他リクエストが詰まる。パターンマッチなんかやりたくても気軽に打てないコマンド。その計算量は耐えられない場合に使えるscanというコマンドを知ったのでメモ書き

scanの概要

mogile.web.fc2.com

少数の要素しか返さない逐次的繰り返しを可能にするので、呼び出された時に長時間(数秒でも)サーバをブロックする可能性があるKEYS あるいは SMEMBERSのようなコマンドの欠点無しに実働環境で使用することができます。

カーソル位置という概念を持ってそのカーソル位置からパターンにマッチするvalueを引っ張ってくる。その操作を繰り返すことでコストを抑えつつkeysのような処理を行うというものらしい。特定のパターンに一致するデータベース内のキーを反復処理するのはここまでやるならRDBとか使った方が良さそうな気がするけど、良くはわからない。

redis-pyではscanもサポートしていて使えるのでサンプルコード。keysとの比較はどの程度なのかは不明だが時間があるときにやってみたい。

def scan(_redis, pattern):
    result = []
    cur, keys  = _redis.scan(cursor=0, match=pattern, count=2)
    result.extend(keys)

    while cur != 0:
        cur, keys = _redis.scan(cursor=cur, match=pattern, count=2)
        result.extend(keys)

    return result

redis · PyPI

参考リンク

https://stackoverrun.com/ja/q/8981953