欢迎光临
我们一直在努力

UCloud云社区Redis 通讯协议

function showImg(url) {
var frameid = ‘frameimg’ + Math.random();
window.img = ‘window.onload = function() { parent.document.getElementById(” + frameid + ”).height = document.getElementById(‘img’).height+’px’; }’;
document.write(”);
}

redis命令发送格式:

*<参数数量> CRLF
$<参数 1 的字节数量> CRLF
<参数 1 的数据> CRLF

$<参数 N 的字节数量> CRLF
<参数 N 的数据> CRLF
其中CRLF表示 rn

举个例子:set name wuzhc
格式化输出:

*3
$3
set
$4
name
$5
wuzhc

说明:

*开头,表示有多少个参数,例如*3表示有3个参数(set, name, wuzhc)

$开头,表示参数的字节长度,例如$3表示set有3个字节,$4表示name有4个字节

每行rn结尾

通信协议为:
*3rn$3rnsetrn$4rnnamern$5rnwuzhcrn

Redis 回复

状态回复(status reply)的第一个字节是 “+”,例如+OKrn

错误回复(error reply)的第一个字节是 “-“,例如-No such keyrn

整数回复(integer reply)的第一个字节是 “:”,例如:1rn

批量回复(bulk reply)的第一个字节是 “$”,例如 $5rnwuzhcrn

多条批量回复(multi bulk reply)的第一个字节是 “*”,例如*2rn$5rnwuzhcrn$3rnagern

PHP 实现Redis客户端

<?php
/**
 * Created by PhpStorm.
 * User: wuzhc2016@163.com
 * Date: 2017年09月12日
 * Time: 9:08
 */
class Client
{
    private $_socket = null;
    public function __construct($ip, $port) 
    {
        $this->_socket = stream_socket_client(
            "tcp://{$ip}:{$port}",
            $errno,
            $errstr,
            1,
            STREAM_CLIENT_CONNECT
        );
        if (!$this->_socket) {
            exit($errstr);
        }
    }
    /**
     * 执行redis命令
     * @param $command
     * @return array|bool|string
     */
    public function exec($command)
    {      
        // 拼装发送命令格式
        $command = $this->_execCommand($command);
        // 发送命令到redis
        fwrite($this->_socket, $command);
        // 解析redis响应内容
        return $this->_parseResponse();
    }
    /**
     * 将字符改为redis通讯协议格式
     * 例如mget name age 格式化为 *3rn$4rnmgetrn$4rnnamern$3rnagern
     * @param $command
     * @return bool|string
     */
    private function _execCommand($command)
    {
        $line = '';
        $crlf = "rn";
        $params = explode(' ', $command);
        if (empty($params)) {
            return $line;
        }
        // 参数个数
        $line .= '*' . count($params) . $crlf;
        // 各个参数拼装
        foreach ((array)$params as $param) {
            $line .= '$' . mb_strlen($param, '8bit') . $crlf;
            $line .= $param . $crlf;
        }
        return $line;
    }
    /**
     * 解析redis回复
     * @return array|bool|string
     */
    private function _parseResponse()
    {
        $line = fgets($this->_socket); 
        $type = $line[0]; 
        $msg = mb_substr($line, 1, -2, '8bit'); 
        switch ($type) {
            // 状态回复
            case '+':
                if ($msg == 'OK' || $msg == 'PONG') {
                    return true;
                } else {
                    return $msg;
                }
            // 错误回复
            case '-':
                exit($msg);
            // 整数回复
            case ':':
                return $msg;
            // 批量回复
            case '$': // $后面跟数据字节数(长度)
                $line = fread($this->_socket, (int)$msg + 2); // 数据字节数 + (rn)两个字节
                return mb_substr($line, 0, -2, '8bit'); // 去除最后两个字节
            // 多条批量回复
            case '*': // *表示后面有多少个参数
                $data = [];
                for ($i = 0; $i < $msg; $i++) {
                    $data[] = $this->_parseResponse();
                }
                return $data;
        }
    }
}
// demo
$client = new Client('127.0.0.1', 6379);
$client->exec('set name wuzhc');
$res = $client->exec('get name');
var_dump($res);
赞(0)
未经允许不得转载:优乐评测网 » UCloud云社区Redis 通讯协议

优乐评测网 找服务器 更专业 更方便 更快捷!

专注IDC行业国内外资源共享发布,给大家带来方便快捷的资源查找平台!

联系我们联系我们

登录

找回密码

注册