電話番号をデータのハッシュにマッピングする、約 1 億個のキーを含む巨大な Redis データベースがあります。
時々、このすべてのデータを集約して SQL データベースに保存する必要があります。集計中に、保存されているすべてのキーを反復処理し、それらの配列を確認する必要があります。
Redis.keys
キーのリスト全体を取得してメモリに保存し、完了するまでに非常に長い時間がかかるため、使用は適切なオプションではありません。次のように、すべてのキーを反復処理するために使用できる列挙子を返すものが必要です。
redis.keys_each { |k| agg(k, redis.hgetall(k)) }
これはRedisでも可能ですか?
これにより、Ruby はメモリ内に 1 億要素の配列を構築できなくなり、おそらくはるかに高速になります。プロファイリングでは、Redis.keys
コマンドを使用すると Ruby が CPU を 100% 占有しますが、Redis プロセスはアイドル状態のようです。
キーを使用してキーからセットを構築することはお勧めできませんが、キーからセットを構築し、smembers を使用してそれを取得したとしても、同じ問題が発生します。