您的位置:晶晶的博客>PHP>PHP中Redis驱动库Predis和phpRedis的区别

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

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方法里有依赖配置项的递归,使用递归实现了重连。

所以这么来看,断线重连该放在底层还是业务层是依据具体情形而定的。

转载请注明本文标题和链接:《PHP中Redis驱动库Predis和phpRedis的区别

相关推荐

哟嚯,本文评论功能关闭啦~