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

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

可以做具体的参考.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值