当前位置: 首页 > 工具软件 > Predis > 使用案例 >

redis php 书,predis VS phpRedis

澹台承
2023-12-01

predis与phpRedis是php连接redis最常用的两个包。在工作项目中,由于十分依赖redis,因此比较predis与phpRedis两者之间的性能差异。

写在前面

测试所用代码地址-github

测试环境

1.redis: Redis server v=2.9.11

2.php: PHP 7.1.29 (cli) (需安装 PHPRedis 扩展)

3.机器信息:Mac i5 8G内存

单机测试

分别顺序执行5W次redis写命令,比较他们的时间(ms)。

虽有一定差别,但差别不大。

次数

predis

phpRedis

5w

3000

2999

5w

3000

3000

10w

6000

6000

10w

5001

5999

50w

34999

33001

50w

32000

28999

并发测试

写API,读写一定量key,统计时间。并使用ab并发测试,比较两者区别。

总次数

并发数

读写数

predis

phpRedis

备注

1000

100

2000

333968

309012

redis变卡,可能有大量等待

5000

100

200

203008

201993

redis变卡,可能有大量等待

5000

50

200

234967

177043

差距变大

5000

100

20

25002

14007

差距继续扩大,猜测phpredis 在建立连接可能更快

5000

100

20

20996

13003

同上

5000

100

2

7000

4999

5000

100

2

10002

4999

5000

100

1

10996

2001

基本确定是建立连接 耗时差距

5000

100

1

7999

2001

// 随机建立连接

$t = rand(0,1);

if ($t == 0) {

$this->testRedis(new phpRedisConn());

}else{

$this->testRedis(new PredisConn());

}

// 测试代码

private function testRedis(conn $conn)

{

$mode = $conn->getMode();

$startTime = Comm::getMillisecond();

Comm::PrintEcho("string 测试开始..." . "当前时间:" . $startTime . " 测试方式:" . $mode);

for ($i = 0; $i < self::NUM; $i++)

{

$conn->set($conn->getMode(), $i);

}

$endTime = Comm::getMillisecond();

$useTime = $endTime - $startTime;

$conn->incrby("useTime_" . $mode, $useTime);

Comm::PrintEcho("string 测试结束..." . "消耗时间:" . $useTime . " 测试方式:" . $mode);

}

复用连接

phpRedis较predis还有一个有点,就是phpredis实现了pconnect()。pconnect在redis结束后,不会销毁redis连接,直到空闲超时自动断开。pconnect是依赖与php-fpm进程的,进程不死,connect就会存在。

/*

* $host redis IP $port redis 端口

* $timeout 默认无限(进程销毁或者redis超时断开)

* $persistent_id 连接标示 新的标示 建立新连接

*/

public function pconnect( $host, $port = 6379, $timeout = 0.0, $persistent_id = null )

// 加入新的连接方式

$t = rand(0,2);

if ($t == 0) {

$this->testRedis(new phpRedisConn());

}elseif ($t == 1)

{

$this->testRedis(new PredisConn());

}elseif ($t == 2)

{

$this->testRedis(new phpRedisPconn());

}

总次数

并发数

读写数

predis

phpRedis

phpRedisPconn

备注

5000

100

200

70982

64999

62002

与上面时间因为执行次数有差别 三者对比即可

5000

50

200

62985

42004

52021

这种方案下,connect更快~

5000

50

200

74992

52001

54997

又测试了一次

5000

100

20

8997

7007

9997

好奇怪~

5000

100

20

10999

7997

11995

5000

100

2

5996

4004

4996

5000

100

2

5000

4998

2000

5000

100

1

5000

4999

1999

5000

100

1

4001

2999

3997

5000

100

1

7001

4996

2001

猜测是不是跟fpm销毁有关,增加并发总次数(并且修改每次计算毫秒的小数点位数 5位)

15000

100

1

11995

5997

5007

有差距,但差距不大

15000

100

1

11995

8005

7000

在测试中,当高并发时,pconnect 可能会又更好的效果,但是并发低的话,connect会更快一些。

另外,pconnect连接数是和fpm数目相关联的。

 类似资料: