php redis stream,php语言实现redis的客户端

php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。

为了更好的了解redis协议,我们用php来实现一个支持大部份命令的客户端类.

redis的协议可参考这个文章http://redis.cn/topics/protocol.html

代码如下:

namespace xtgxiso;

class Redis {

private $redis_socket = false;

private $cmd = '';

public function __construct($host='127.0.0.1',$port=6379,$timeout = 3) {

$this->redis_socket = stream_socket_client("tcp://".$host.":".$port, $errno, $errstr,  $timeout);

if ( !$this->redis_socket) {

throw new Exception("{$errno} - {$errstr}");

}

}

public function __destruct() {

fclose($this->redis_socket);

}

public function __call($name, $args) {

$crlf = "\r\n";

array_unshift($args,$name);

$command = '*' . count($args) . $crlf;

foreach ($args as $arg) {

$command .= '$' . strlen($arg) . $crlf . $arg . $crlf;

}

$fwrite = fwrite($this->redis_socket,$command);

if ($fwrite === FALSE || $fwrite <= 0) {

throw new Exception('Failed to write entire command to stream');

}

return $this->readResponse();

}

private function readResponse() {

$reply = trim(fgets($this->redis_socket, 1024));

switch (substr($reply, 0, 1)) {

case '-':

throw new Exception(trim(substr($reply, 4)));

break;

case ' ':

$response = substr(trim($reply), 1);

if ($response === 'OK') {

$response = TRUE;

}

break;

case '$':

$response = NULL;

if ($reply == '$-1') {

break;

}

$read = 0;

$size = intval(substr($reply, 1));

if ($size > 0) {

do {

$block_size = ($size - $read) > 1024 ? 1024 : ($size - $read);

$r = fread($this->redis_socket, $block_size);

if ($r === FALSE) {

throw new Exception('Failed to read response from stream');

} else {

$read = strlen($r);

$response .= $r;

}

} while ($read < $size);

}

fread($this->redis_socket, 2); /* discard crlf */

break;

/* Multi-bulk reply */

case '*':

$count = intval(substr($reply, 1));

if ($count == '-1') {

return NULL;

}

$response = array();

for ($i = 0; $i < $count; $i ) {

$response[] = $this->readResponse();

}

break;

/* Integer reply */

case ':':

$response = intval(substr(trim($reply), 1));

break;

default:

throw new RedisException("Unknown response: {$reply}");

break;

}

return $response;

}

}

/*

$redis = new Client_test();

var_dump($redis->auth("123456"));

var_dump($redis->set("xtgxiso",'abc'));

var_dump($redis->get("xtgxiso"));

*/

通过实现,我们基本了解redis的协议。

Predis Phpredis Rediska介绍 1 Predis   Predis是一个灵活和特性完备(PHP>5 3)的支持RedisPHP客户端 当前版本为0 6 3 默认不支持PHP5 2 主要特性如下: 完整的支持从1 2到2 4的Redis 并且支持当前正在开发的版本; 提供客户端实现的一致性哈希算法 支持自定义; 在单个或聚合连接中支持命令管道;(Command pipelining on single and aggregated connections) 能够通过TCP IP或者Unix domain sockets连接到redis 支持持久连接; 自动连接Redis实例 使用“懒惰”方式 只在第一个命令发出时执行连接; 可以灵活定义客户端的命令集合; 2 Phpredis(推荐使用)   这是一个二进制版本的PHP客户端 按照的说法 效率要比Predis高 这个版本支持作为Session的Handler 这个扩展的有点在于无需加载 任何外部文件 使用比较方便 缺点在于难于扩展 一般的PHP程序员无法对其做出扩展 考虑到Redis正在飞速发展过程中 缺乏扩展的特性还是有些影响 的 需要维护过程中注意进行升级更新 调用Redis的相关方法 Redis:: construct构造函数$redis new Redis ; 1 基本相关操作 connect open 链接redis服务 参数host: string 服务地址 port: int 端口号 timeout: float 链接时长 可选 默认为 0 不限链接时间 注: 在redis conf中也有时间 默认为300 pconnect popen 不会主动关闭的链接 参考上面 setOption 设置redis模式 getOption 查看redis设置的模式 ping 查看连接状态 get 得到某个key的值(string值) 如果该key不存在 return false set 写入key 和 value(string值) 如果写入成功 return ture">Predis Phpredis Rediska介绍 1 Predis   Predis是一个灵活和特性完备(PHP>5 3)的支持RedisPHP客户端 当前版本为0 6 3 默认不支持PHP5 2 主要特性如下: 完整的支持从1 2到2 4的Redis 并且支持当前正在开发的版本; 提供客户 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值