背景
Redisにダミーデータを投入するpythonスクリプトを使っていた。 データ件数が少ないうちはよかったのだが、多数のデータを入れるようになると、時間がかかりすぎて辛くなってきた。
パイプラインを使い、Redisとの通信ラウンドトリップを減らす
Redisのパイプラインを使うと、複数のRedisへのコマンド実行をまとめて一度に実行することができる。 これにより、ラウンドトリップの回数を減らすことができ、パフォーマンスが向上する。
サンプルコード
以下のスクリプトでは、時系列データを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のパフォーマンスチューニングの際に参考にしたい。