Redis是典型的C/S架构软件,Client 和 Server 之间通过TCP连接进行通信,所以原则上只要是支持socket编程的语言都可以用来编写Redis的客户端,PHP自然也不例外,我们这里使用 stream_socket_* 族函数进行扩展 编程。
要编写Redis扩展,首先我们得了解Redis客户端和服务端之间的通信协议,官方称之为 RESP(REdis 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
可以做具体的参考.