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

何十億ものデータをRedisに効率的に挿入するにはどうすればよいですか?

    質問とサンプルコードに関するいくつかのポイント。

    1. パイプラインは特効薬ではありません。使用する前に、パイプラインが何をするのかを理解する必要があります。パイプライン処理は、サーバーからの応答と同様に、バルクとして送信されるいくつかの操作をバッチ処理します。得られるのは、各操作のネットワークラウンドトリップ時間がバッチのネットワークラウンドトリップ時間に置き換えられることです。しかし、無限のサイズのバッチはリソースを実際に浪費します。効果を上げるには、バッチのサイズを十分に小さく保つ必要があります。経験則として、私は通常、パイプラインごとに60KBを目標にしようとしますが、すべてのデータが異なるため、パイプラインでの実際の操作の数も異なります。キーとその値が約1KBであると仮定すると、pipeline.execute()を呼び出す必要があります。 60回程度の操作ごと。

    2. 私がひどく誤解しない限り、このコードは実行されるべきではありません。 HMSETを使用しています SETのように 、したがって、基本的にハッシュのフィールド->値のマッピングが欠落しています。ハッシュ(HMSET )および文字列(SET )は異なるデータ型であるため、それに応じて使用する必要があります。

    3. この1つの小さなループが「10億のデータ」全体を担当しているように見えます。その場合、辞書を保持するためのRAMがたくさんない限り、コードを実行しているサーバーが狂ったようにスワッピングするだけではありません。また、(Pythonの速度に関係なく)非常に効果がありません。このプロセスの複数のインスタンスを実行して、データ挿入を並列化する必要があります。

    4. リモートでRedisに接続していますか?その場合、ネットワークがパフォーマンスを制限している可能性があります。

    5. Redisの設定を検討してください。実際にボトルネックであると想定して、このタスクのパフォーマンスを向上させるために、これらを微調整/調整することができます。



    1. ASP.NETCoreControllerでのStackExchange.Redisの使用

    2. スタック/失効したResqueワーカーをクリアするにはどうすればよいですか?

    3. ブルキュー:ジョブが失敗した場合、キューが残りのジョブを処理しないようにするにはどうすればよいですか?

    4. mongodbの最後のNレコードを取得するにはどうすればよいですか?