戚薇戚薇戚薇

让他夜夜
热液乳业人员

PHP中Redis驱动库Predis和phpRedis的区别

更新时间:2020-05-21 11:33:22点击:

Redis非常刁悍,功效也充足富厚,以前说明过少许内容,见此:《非干系型内存数据库Redis的关联要点

PHP中应用Redis是需求用到驱动库的,一般多见的就俩:phpRedis和Predis

驱动库扼要说明

phpRedis

phpRedis是C完成的一个php的pecl扩大,php代码里干脆应用该扩大供应的关联类、技巧即可。

pecl扩大地点:http://pecl.php.net/package/redis

源码库:https://github.com/phpredis/phpredis

phpRedis扩大的编译安置没甚么分外的,下载下来解压phpize、make、make install,建设文件里建设下就ok了,这个扩大自己的安置没有外部依附,由于里面完成应用了php层封装的streem流操纵。

简略的应用示例:

<?php $redis = new Redis();$is_connect = $redis->connect('127.0.0.1', 6379); if ($is_connect) {    echo "持续redis胜利";    $redis->set("a", "a_value"); // 往redis里写入一个string    $redis->get("a"); // 从redis里读取一个string    $redis->delete("a"); // 从redis里删除一个string} else {    echo "持续redis失利";}

so easy对过失。

Predis

Predis就更牛批了,应用的原生的PHP代码完成的一套Redis-client法式,能够不消安置任何扩大,只引入php代码便非常利便的应用redis。

源码库:https://github.com/nrk/predis

Composer包:https://packagist.org/packages/predis/predis

由于是一个原生的php包,并且支撑composer,因此应用上就更利便了,引入以后干脆就首先搞起。

<?php $client = new Predis\Client([    'scheme' => 'tcp',    'host'   => '127.0.0.1',    'port'   => 6379,]); $client->set('a', 'a-value');// 建设1个string$client->get('a');// 读取1个string

固然Predis还供应更多的建设选项和技巧,比如自界说底层tcp链接的方法,就不深刻了。

驱动库迥异

机能上的迥异

网上找到一张比拟图,没有考证过,枯燥影像中C完成的服从必定是要高于php原生代码完成的,否则的话种种pecl扩大存在的作用安在?

predis和phpredis的机能比较

断线重连

断线重连一般fpm模式下的web软件开辟非常少波及到,由于都是少许短持续,一次http要求结束本次tcp底层持续就停止了,在短短几秒内基础就扯不上断线,更扯不上重连的疑问,非要死磕稍不注意就磕到蛋了。但关于常驻历程范例的php软件,比如cli模式下的php剧本,再比如这几年大火的支撑Coroutine协程的swoole软件。

Redis的断线重连与MySQL非常类似,真相php底层与MySQL-Server、Redis-Server交互都是tcp/sock方法,因此这里的断线即是指php代码作为一个client与表层的基于tcp/sock的server之间的持续非主动断开

Redis和MySQL客户端的驱动都支撑所谓短持续和长持续的说法,一般fpm模式下的web软件根基都不会应用所谓长持续,由于都是 一次持续--交互数据--断开持续 就完事儿,若应用长持续而不足时主动封闭的话,极易发现服无端的持续数被耗尽。这里的长持续和短持续中的是非并不是指能够长光阴或短光阴的持续交互,而是值长持续方法持续到server以后底层能够复用tcp/sock,无谓每次应用时都要倡议一个connect持续历程。上方所谓的断线本来不辨别长持续和短持续的,这里的断线更详细的明白即是php与Redis-Server或MySQL-Server交互历程中由于外部缘故而断开了tcp/sock持续的环境,比如:php里读取了redis-server里的某个key,而后去向分其余逻辑的时分这会儿他们之间的tcp/sock由于外部缘故而断开了 (不是php主动断开,不妨redis-server主动断开也不妨由于网页欠亨或发抖等等),php处分逻辑完成了这个时分要往Redis-Server里set写入1个key就会发现疑问,这个时分就要波及到主动的重连机制了。

phpRedis原生支撑上述景遇下的断线重连,而Predis临时是不支撑的,固然Predis也是能够本人完成断线重连的,phpRedis断线重连只是在确立持续以后外部缘故被断开而连续实行交易的时分底层主动重连,测试重连次数为写死的10次,每次测试重试之间的隔断为retry_interval参数指定的毫秒数,若未建设该参数则测试重连的10次之间没有隔断,固然测试重连10次历程中只有某一次连上了就不会再重试了的,若10次都没连上就报错了。

PHPRedis断线重连

在非常多php项目中,断线重连是由交易代码php本人完成的,比如laravel里的:

laravel下mysql短线重连
laravel下mysql短线重连
laravel下mysql短线重连

再比如ThinkPHP5.1中的:

ThinkPHP5.1断线重连
ThinkPHP5.1断线重连

connect技巧里有依附建设项的递归,应用递归完成了重连。

因此这么来看,断线重连该放在底层或是交易层是根据详细景遇而定的。