phpredis中的connect和pconnect
来源:互联网 发布:sql update 多条 编辑:程序博客网 时间:2024/06/08 11:32
现在不管是在缓存方面,还是NoSQL方面,Redis很火也很流行,但是使用方面的经验不是很多,包括Redis的一些优化配置,还有使用Redis的一些技巧和经验都没有一个官方的指导,所以在网上能搜索到很多相关的东西,但是发现不一定完全匹配自己遇到的一些问题,而且有的文章只是告诉你要这么做,但是没有深究到底是为什么?
最近碰到一个项目的优化,该项目其实逻辑很简单,大的结构就是处理用户的请求,然后读Redis,返回对应的数据。而问题的所在在于该项目有个特点,就是存在整点效应——平时访问量比较低,服务器压力不大,但是整点的时候并发能够达到平时的4-5倍,服务器完全抗不住。所以我们就慢慢梳理整个项目的架构,还有流程,想从中发现问题的所在。
为了先解决并发高服务器负载过高的问题,我们首先分析了…(话扯远了,背景就介绍到这里,呵呵。。)
首先先介绍下connect
和pconnect
的区别。
connect:脚本结束之后连接就释放了。
pconnect:脚本结束之后连接不释放,连接保持在php-fpm进程中。
为了验证这点,我们可以写个脚本测试一下。
其中服务器是nginx
,php-fpm
采用静态方式,因为动态方式下php-fpm
的进程数量可能会变化,所以为了简单我们采用静态方式启动。
其中php-fpm的数量我们设置成5个。
下面的脚本测试使用connect
的情况,我们让脚本连接到redis,然后休眠10s。
<?php$app = new App ();$app->get ( '/', function () { $redis = new Redis (); $redis->connect ( '127.0.0.1' ); sleep(10); echo 'Hello World'; // $redis->close ();} );return $app;
然后我们运行5个请求:
curl http://localhost:8081/
这时候我们可以看下redis中的connect_clients
:
$ redis-cli info | grep connected_clientsconnected_clients:14
等脚本运行完毕之后我们再看一下connect_clients
:
$ redis-cli info | grep connected_clientsconnected_clients:9
之前建立的redis连接资源被释放了。
我们修改上面的代码,把connect
改成pconnect
:
<?php$app = new App ();$app->get ( '/', function () { $redis = new Redis (); $redis->pconnect ( '127.0.0.1' ); sleep(10); echo 'Hello World'; // $redis->close ();} );return $app;
和上面同样的操作,发现脚本脚本运行结束后connected_clients
还是14:
$ redis-cli info | grep connected_clientsconnected_clients:14
这说明脚本运行结束后,redis
连接资源并没有释放,而是由php-fpm
进程保持(可以通过 kill php-fpm
看到,当脚本停止运行后连接释放)
所以使用pconnect
代替connect
,可以减少频繁建立redis连接的消耗。
另外,使用pconnect
还可以减少同一个进程(php-fpm
)频繁建立连接的消耗,可以通过以下代码验证:
使用connect
的情况:
<?php$redis1 = new Redis();$redis1->connect('127.0.0.1');sleep(5);$redis2 = new Redis();$redis2->connect('127.0.0.1');sleep(5);//$redis->close();//$redis2->close();
运行上述脚本,会发现connect_clients
会增加2个。
使用pconnect
的情况:
<?php$redis1 = new Redis();$redis1->pconnect('127.0.0.1');sleep(5);$redis2 = new Redis();$redis2->pconnect('127.0.0.1');sleep(5);//$redis->close();//$redis2->close();
而运行上述代码,connect_clients
只会增加1个,这说明在一个进程中,pconnect
是可以保持redis连接状态提供复用的。
https://blog.amlun.com/archives/1420
- phpredis中的connect和pconnect
- 关于phpredis中的connect和pconnect的一些见解
- phpredis connect 与 pconnect
- pconnect和connect
- 深入理解phpredis的pconnect方法
- predis如何实现phpredis的pconnect方法
- 关于redis的pconnect和connect,使用中出现的问题
- pconnect
- php和phpredis安装
- redis 和phpredis安装
- phpredis
- phpredis
- 安装redis和phpredis模块
- 安装redis和phpredis模块
- UDP中的connect方法 和TCP的connect方法详解
- Oracle 中的树查询和 connect by
- Oracle 中的树查询和 connect by
- udp通讯中的connect()和bind()函数
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated..
- 有哪些短小却令人惊叹的 JavaScript 代码
- 数据导出/文件下载 实现方案
- Invocation of init method failed; Could not get a resource from the pool
- php复习 第六天 字符串操作相关函数
- phpredis中的connect和pconnect
- 2016/11/10 1000. 完全二叉树
- AndroidStudio 签名时输入的Master Password(忘记密码Master Password怎么办)
- 报错 invalid LOC header (bad signature)
- Android 设置透明状态栏后,EditText被软键盘挡住问题
- IT面试总结
- 【亲测可用】webstorm 2016 激活破解
- 利用Python创建一个简单web服务
- Android-This Handler class should be static or leaks might occur