Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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)にひっかかり途中で止まってしまいました。

devneko
フリーのプログラマです。 ウェブシステム開発、スマホアプリ開発にフルスタックで対応可能です。
http://blog.devneko.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away