作为程序员一定要保持良好的睡眠,才能好编程

使用原生php编写redis扩展-客户端

发布时间:2018-12-10

Redis是典型的C/S架构软件,Client 和 Server 之间通过TCP连接进行通信,所以原则上只要是支持socket编程的语言都可以用来编写Redis的客户端,PHP自然也不例外,我们这里使用 stream_socket_* 族函数进行扩展 编程。



要编写Redis扩展,首先我们得了解Redis客户端和服务端之间的通信协议,官方称之为 RESPREdis Serialization Protocol),这个协议其实还是很简单易懂的。下面来看看:


1、所有命令和数据以 "\r\n" 结尾

2、服务器根据执行的命令返回不同类型的结果,不同的数据类型用第一个字符标识,具体如下:

 

  • "+" 服务器返回一个简单字符串结果 比如 set foo bar 命令返回 +OK\r\n

  • "-"  命令执行出错,比如  -WRONGTYPE Operation against a key holding the wrong kind of value\r\n

  •  ":"  整数结果,比如 dbsize 命令返回  :1000\r\n

  • "$"  二进制安全的长字符串结果,比如 get foo 命令返回  $3\r\nbar\r\n  其中数字3的位置表示字符串长度,字符串被一对\r\n包含

  • "*"  返回结果是一个数组,比如 hkeys foobar 命令返回  *2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n  其中*后数字2的位置表示元素个数,之后可以是以上各种基本类型的组合。

3、客户端发送命令通过长字符串数组形式,例如要查询 set foobar hello 命令写成  *3\r\n$3\r\nset\r\n$6\r\nfoobar\r\n$5\r\nhello\r\n

接下来用代码简单演示:

<?php  
$redis = stream_socket_client('tcp://127.0.0.1:6379', $errno, $errstr, 5);  
  
if (!$redis)  
{  
    die('连接redis服务器失败: ' . $errstr);  
}  
  
  
// 查询代码....  
$cmd = "*1\r\n$6\r\nDBSIZE\r\n";  //dbsize  
fwrite($redis, $cmd, strlen($cmd));  
$ret = fread($redis, 4096);  
echo $ret;  
echo "----------------------\r\n";  
  
$cmd = "*3\r\n$3\r\nset\r\n$6\r\nfoobar\r\n$5\r\nredis\r\n"; //set foobar redis  
fwrite($redis, $cmd, strlen($cmd));  
$ret = fread($redis, 4096);  
echo $ret;  
echo "----------------------------\r\n";  
  
$cmd = "*2\r\n$3\r\nget\r\n$6\r\nfoobar\r\n";  //get foobar  
fwrite($redis, $cmd, strlen($cmd));  
$ret = fread($redis, 4096);  
echo $ret;  
echo "----------------------------\r\n";  
  
$cmd = "*4\r\n$4\r\nhset\r\n$7\r\nanimals\r\n$3\r\ncat\r\n$3\r\ntom\r\n";  //hset animals cat tom  
fwrite($redis, $cmd, strlen($cmd));  
$ret = fread($redis, 4096);  
echo $ret;  
echo "-------------------------------------\r\n";  
  
$cmd = "*2\r\n$5\r\nhkeys\r\n$7\r\nanimals\r\n";  //hkeys animals  
fwrite($redis, $cmd, strlen($cmd));  
$ret = fread($redis, 4096);  
echo $ret;  
echo "-------------------------------------\r\n";  
  
stream_socket_shutdown($redis, STREAM_SHUT_RDWR);

执行结果:

[root@localhost php]# php redis.php   
:15  
----------------------  
+OK  
----------------------------  
$5  
redis  
----------------------------  
:0  
-------------------------------------  
*1  
$3  
cat  
-------------------------------------


这里有一个具体封装类:

https://www.cnblogs.com/ylbstu/articles/8510206.html


可以做具体的参考.