シ〜らかんす

プログラミングとか、カメラとか。

Redisへの大量データインサートには、パイプラインを使おう

背景

Redisにダミーデータを投入するpythonスクリプトを使っていた。 データ件数が少ないうちはよかったのだが、多数のデータを入れるようになると、時間がかかりすぎて辛くなってきた。

パイプラインを使い、Redisとの通信ラウンドトリップを減らす

Redisのパイプラインを使うと、複数のRedisへのコマンド実行をまとめて一度に実行することができる。 これにより、ラウンドトリップの回数を減らすことができ、パフォーマンスが向上する。

redis.io

サンプルコード

以下のスクリプトでは、時系列データを24時間分、5秒間隔で作成してRedisに入れている。

r = redis.Redis(host=HOST, password=PASSWORD, port=PORT, db=0)
unix_time_from = unix_time_now - 24 * 3600
for i, data in enumerate(data_list):
        unix_time_current = unix_time_from
        pipe = r.pipeline()
        while unix_time_now >= unix_time_current:
            pipe.zadd(data["id"], {data["value"]: unix_time_current})
            unix_time_current += 5
        pipe.execute()

どれくらい速くなった?

パイプラインを使う前はあまりに遅く、途中で実行を止めたのだが、あのまま続けていたら2.5時間程度かかる見込みだった。 パイプライン使用後は、数分程度まで短縮された。

まとめ

パイプラインを使うことで、複数のコマンドをまとめて実行でき、パフォーマンスが向上する。 Redisのパフォーマンスチューニングの際に参考にしたい。