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数目相关联的。

redis php 书,predis VS phpRedis相关推荐

  1. redis客户端 predis与phpredis 比较

    predis目录中有一个FAQ.markdown文件,FAQ中文意思经常问到的问题,该文档对redis的客户端predis和phpredis进行了比较分析,优点,不足做了说明,还是老外的文档清楚,一看 ...

  2. redis php 书,PHP-redis中文文档

    Redis::__construct构造函数 $redis = new Redis(); connect, open 链接redis服务 参数 host: string,服务地址 port: int, ...

  3. php连接redis报错,PHP使用phpredis链接redis错误

    如题, 项目中使用phpredis链接 redis,偶尔报如下错误: PHP Fatal error: Uncaught exception 'RedisException' with message ...

  4. predis.php,phpredis和predis之间有何区别?phpredis和predis的区别对比

    本篇文章给大家带来的内容是关于phpredis和predis之间有何区别?phpredis和predis的区别对比,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. phpredis和p ...

  5. redis php 书,php中redis的使用

    转自:http://bbs.redis.cn/forum.php?mod=viewthread&tid=481 phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模 ...

  6. linux redis 简书,Linux | Redis

    写在前面的话 常言道,不作笔记不读书.在下是深有体会啊,所以,跟我一起做下本节的笔记吧,或许多年以后,你一定会感谢今天的你. 安装 在官网的下载页 Redis Download 直接写了在Linux的 ...

  7. 安装phpredis扩展以及phpRedisAdmin工具

    先从phpredis的git拿到最新的源码包: wget https://github.com/nicolasff/phpredis/archive/master.tar.gz   然后解压到进入目录 ...

  8. predis如何实现phpredis的pconnect方法

    predis和phpredis都是redis的php客户端,区别可以看这里,这里不赘述. phpredis是php扩展,由C语言编写,诞生较早,很多PHPer都熟悉. predis是用PHP语言编写, ...

  9. 利用predis操作redis方法大全(方便自己使用)

    predis是php连接redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写,相信改换c语言编写的php扩展后 ...

最新文章

  1. windows下多版本python安装与pip安装和pip使用 吐血总结
  2. C#初学——doWhile
  3. 64% 的企业未实现智能化,5成公司算法工程师团队规模小于 10人,AI 工程师的机遇在哪里?...
  4. 吴恩达新动作:建立全新机器学习资源Hub,「以数据为中心的AI」大本营
  5. 用flex进行网易云音乐界面构建和布局解析(2)
  6. int * * a[10] int * (*a)[10]和 int(*a[10])() 是什么意思
  7. Vue页面加载使用二级属性的时候报错TypeError: Cannot read property ‘name‘ of undefined“
  8. linux挂载磁盘分区,Linux 新磁盘分区与挂载
  9. rman report 命令
  10. linux常用的脚本、命令
  11. Tecplot 360 按教程安装完毕后,弹出“Is your Tecplot 360 EX liense valid?”【终极解决办法】
  12. 7-1 作业调度算法--先来先服务 (30 分)(思路+详解+vector+map+map做法)Come Baby!!!!!!!!!!!
  13. [XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)
  14. C#提取网页中的超链接
  15. DB2 SQLCODE=-803,SQLSTATE=23505,SQLERROR=1
  16. stm32f103c8t6开发版点亮oled屏幕工程文件_OLED液晶屏如何显示中文呢
  17. 联想i微型计算机怎么拆,联想t410i如何拆机?联想t410i拆机方法【图文】
  18. 计算机232 数据传输,RS232串口通信的传输格式和接收过程
  19. 李洪强和你一起学习前端之面试题
  20. 华为云桌面---cloudclient安装使用

热门文章

  1. 免装版mysql卸载
  2. win10使用cmd修改ip的dns
  3. NTRIP/nbsp;SUPL
  4. Apple开发者账号介绍
  5. Xshell7连接VirtualBox虚拟机
  6. 概率论和数理统计笔记之事件的概率
  7. 计算机丢失UxTheme无法修复,Win7提示uxtheme.dll丢失的处理技巧
  8. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第47讲:PHP程序设计中的文件操作
  9. 回顾丨李开复哥大毕业演讲:工程师的AI银河系漫游指南
  10. 备考计算机软件,2018年计算机软件水平考试备考心得