ハッシュ型のhMSetが、hSetをたくさん呼ぶのと比べてどのくらい早いのか気になったので、ベンチマークとってみました。
各種バージョンは以下の通り。
software | version |
---|---|
PHP | 5.6.24 |
phpredis | 2.2.8 |
redis-server | 2.8.19 |
// hMSet // 3.4 sec
bench(function($redis, $target){
return $redis->hMSet("a", $target);
});
// foreach($arr){set} // 30 sec
bench(function($redis, $target){
$res = true;
foreach($target as $key => $value) {
$res = ($res && $redis->hSet("a", $key, $value));
}
return $res;
});
// Redis::MULTI // 33 sec
bench(function($redis, $target){
$multi = $redis->multi();
foreach($target as $key => $value) {
$multi->hSet("a", $key, $value);
}
return $multi->exec();
});
// Redis::PIPELINE // 7 sec
bench(function($redis, $target){
$multi = $redis->multi(Redis::PIPELINE);
foreach($target as $key => $value) {
$multi->hSet("a", $key, $value);
}
return $multi->exec();
});
function bench($func) {
$redis = new Redis();
$redis->connect('/tmp/redis.sock');
$redis->select(254);
$target = range(1, 1000);
$st = microtime(true);
for($i = 0; $i < 100; $i++) {
$redis->del("a");
$res = $func($redis, $target);
}
echo microtime(true) - $st . PHP_EOL;
}
pipelineの倍くらい早いです。普通にhSetをforeachしただけだと、10倍位差がでてますねー。
使ったマシンのスペック
redis-benchmark
の結果だけ貼っておくので、これで察してください。
[sitri@ndxbn:~]redis-benchmark -q
PING_INLINE: 64683.05 requests per second
PING_BULK: 58997.05 requests per second
SET: 56338.03 requests per second
GET: 61766.52 requests per second
INCR: 59136.61 requests per second
LPUSH: 59701.50 requests per second
LPOP: 60459.49 requests per second
SADD: 60168.47 requests per second
SPOP: 62774.64 requests per second
LPUSH (needed to benchmark LRANGE): 60569.35 requests per second
LRANGE_100 (first 100 elements): 30202.36 requests per second
LRANGE_300 (first 300 elements): 12763.24 requests per second
LRANGE_500 (first 450 elements): 8623.66 requests per second
LRANGE_600 (first 600 elements): 6710.96 requests per second
MSET (10 keys): 45662.10 requests per second
ほかやりたいこと
Set型のsAdd()
とかZSetのzAdd()
とかだと可変引数ですし、そっちもやりたい。