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
可以做具体的参考.