在 phpredis 中,我们进行了一个实验来比较使用 hMSet 上 pipeline 批量发送 hSet 相比于直接发送的速度有多快
由于对哈希类型的hMSet相较于频繁调用hSet是否更快感到好奇,所以进行了基准测试。
以下是各种版本。
softwareversionPHP5.6.24phpredis2.2.8redis-server2.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;
}
管道比較快。只是普通地使用 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(),那么它们都是可变参数,我也想要使用可变参数。