在 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(),那么它们都是可变参数,我也想要使用可变参数。

广告
将在 10 秒后关闭
bannerAds