LoginSignup
26
21

More than 5 years have passed since last update.

redis(predis)でパイプライニング(pipelining)を使って高速にコマンドを実行する

Posted at

redisにパイプライニングといって複数のコマンドを一括実行する機能があります。
これを使うことでひとつひとつコマンドを実行するよりも圧倒的に高速な実行が可能です。
僕の環境ではhset(),expire()を1万回繰り返して確認したところ約5倍の性能差がありました。

クライアントライブラリによってはmulti/execのオプションなどでパイプラインを実行するものもあるため、自分が使う
クライアントライブラリにおけるパイプライン処理の実装方法をしっかり確認しておく必要があります。
predisというクライアントライブラリではpipeline()メソッドというパイプラインのためのメソッドが用意されており
これによって取得できるPipelineクラスのインスタンスを使ってコマンドを指定します。

以下はpredisで1万回のhset/expireをパイプラインで処理するコード例です。

$redis->pipeline(function($pipe){
  for ( $i = 0; $i < 10000; $i++ ) {
    $pipe->hset('hogehoge'.$i, 'hoge', $i);
    $pipe->expire('hogehoge'.$i, 30);
  }
});

便利なパイプライニングですが、メモリ使用量には注意が必要です。
上記のループを5万件にして実行後にmemory_get_peak_usage()すると84MBのメモリ消費でした。
10万件ではデフォルトのメモリ使用量制限(128MB)にひっかかり途中で止まってしまいました。

26
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21