成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Redis 通訊協(xié)議

weizx / 1564人閱讀

摘要:命令發(fā)送格式參數(shù)數(shù)量參數(shù)的字節(jié)數(shù)量參數(shù)的數(shù)據(jù)參數(shù)的字節(jié)數(shù)量參數(shù)的數(shù)據(jù)其中表示舉個(gè)例子格式化輸出說明開頭,表示有多少個(gè)參數(shù),例如表示有個(gè)參數(shù)開頭,表示參數(shù)的字節(jié)長(zhǎng)度,例如表示有個(gè)字節(jié),表示有個(gè)字節(jié)每行結(jié)尾通信協(xié)議為回復(fù)狀態(tài)回復(fù)的第一個(gè)字節(jié)是,

redis命令發(fā)送格式:

*<參數(shù)數(shù)量> CRLF
$<參數(shù) 1 的字節(jié)數(shù)量> CRLF
<參數(shù) 1 的數(shù)據(jù)> CRLF
...
$<參數(shù) N 的字節(jié)數(shù)量> CRLF
<參數(shù) N 的數(shù)據(jù)> CRLF
其中CRLF表示 rn

舉個(gè)例子:set name wuzhc
格式化輸出:

*3
$3
set
$4
name
$5
wuzhc

說明:

*開頭,表示有多少個(gè)參數(shù),例如*3表示有3個(gè)參數(shù)(set, name, wuzhc)

$開頭,表示參數(shù)的字節(jié)長(zhǎng)度,例如$3表示set有3個(gè)字節(jié),$4表示name有4個(gè)字節(jié)

每行rn結(jié)尾

通信協(xié)議為:
*3
$3
set
$4
name
$5
wuzhc
Redis 回復(fù)

狀態(tài)回復(fù)(status reply)的第一個(gè)字節(jié)是 "+",例如+OK

錯(cuò)誤回復(fù)(error reply)的第一個(gè)字節(jié)是 "-",例如-No such key

整數(shù)回復(fù)(integer reply)的第一個(gè)字節(jié)是 ":",例如:1

批量回復(fù)(bulk reply)的第一個(gè)字節(jié)是 "$",例如 $5 wuzhc

多條批量回復(fù)(multi bulk reply)的第一個(gè)字節(jié)是 "*",例如*2 $5 wuzhc $3r age

PHP 實(shí)現(xiàn)Redis客戶端
_socket = stream_socket_client(
            "tcp://{$ip}:{$port}",
            $errno,
            $errstr,
            1,
            STREAM_CLIENT_CONNECT
        );
        if (!$this->_socket) {
            exit($errstr);
        }
    }

    /**
     * 執(zhí)行redis命令
     * @param $command
     * @return array|bool|string
     */
    public function exec($command)
    {      
        // 拼裝發(fā)送命令格式
        $command = $this->_execCommand($command);

        // 發(fā)送命令到redis
        fwrite($this->_socket, $command);

        // 解析redis響應(yīng)內(nèi)容
        return $this->_parseResponse();
    }

    /**
     * 將字符改為redis通訊協(xié)議格式
     * 例如mget name age 格式化為 *3
$4
mget
$4
name
$3
age

     * @param $command
     * @return bool|string
     */
    private function _execCommand($command)
    {
        $line = "";
        $crlf = "
";
        $params = explode(" ", $command);
        if (empty($params)) {
            return $line;
        }

        // 參數(shù)個(gè)數(shù)
        $line .= "*" . count($params) . $crlf;

        // 各個(gè)參數(shù)拼裝
        foreach ((array)$params as $param) {
            $line .= "$" . mb_strlen($param, "8bit") . $crlf;
            $line .= $param . $crlf;
        }

        return $line;
    }

    /**
     * 解析redis回復(fù)
     * @return array|bool|string
     */
    private function _parseResponse()
    {
        $line = fgets($this->_socket); 
        $type = $line[0]; 
        $msg = mb_substr($line, 1, -2, "8bit"); 

        switch ($type) {
            // 狀態(tài)回復(fù)
            case "+":
                if ($msg == "OK" || $msg == "PONG") {
                    return true;
                } else {
                    return $msg;
                }
            // 錯(cuò)誤回復(fù)
            case "-":
                exit($msg);
            // 整數(shù)回復(fù)
            case ":":
                return $msg;
            // 批量回復(fù)
            case "$": // $后面跟數(shù)據(jù)字節(jié)數(shù)(長(zhǎng)度)
                $line = fread($this->_socket, (int)$msg + 2); // 數(shù)據(jù)字節(jié)數(shù) + (
)兩個(gè)字節(jié)
                return mb_substr($line, 0, -2, "8bit"); // 去除最后兩個(gè)字節(jié)
            // 多條批量回復(fù)
            case "*": // *表示后面有多少個(gè)參數(shù)
                $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);

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25823.html

相關(guān)文章

  • 用 Go 來了解一下 Redis 通訊協(xié)議

    摘要:用來了解一下通訊協(xié)議原文地址用來了解一下通訊協(xié)議都有那么多包來支撐你使用,那你是否有想過有了服務(wù)端,有了客戶端,他們倆是怎樣通訊,又是基于什么通訊協(xié)議做出交互的呢介紹基于我們的目的,本文主要講解和實(shí)踐的通訊協(xié)議的客戶端和服務(wù)端是通過連接來進(jìn) 用 Go 來了解一下 Redis 通訊協(xié)議 原文地址:用 Go 來了解一下 Redis 通訊協(xié)議 Go、PHP、Java... 都有那么多包來支...

    cnsworder 評(píng)論0 收藏0
  • PHP即時(shí)通訊設(shè)計(jì)實(shí)現(xiàn)

    摘要:即時(shí)通訊中,最重要的是響應(yīng)速度,我們需要展示消息列表那么這時(shí)會(huì)有未讀消息,未讀數(shù)量,最后一條消息內(nèi)容,時(shí)間等等。目前設(shè)計(jì)是單表單庫。這里只是對(duì)即時(shí)通訊設(shè)計(jì)上做了一些簡(jiǎn)要的闡述,如有疑問和建議,請(qǐng)?jiān)谠u(píng)論區(qū)回復(fù)。 詳解即時(shí)通訊設(shè)計(jì)實(shí)現(xiàn)(PHP+GatewayWorker+Redis) 需要實(shí)現(xiàn)的功能 一對(duì)一聊天(私聊) 一對(duì)多聊天(群聊) 類似QQ,微信等聊天列表 實(shí)時(shí)消息 顯示 工具...

    asoren 評(píng)論0 收藏0
  • PHP即時(shí)通訊設(shè)計(jì)實(shí)現(xiàn)

    摘要:即時(shí)通訊中,最重要的是響應(yīng)速度,我們需要展示消息列表那么這時(shí)會(huì)有未讀消息,未讀數(shù)量,最后一條消息內(nèi)容,時(shí)間等等。目前設(shè)計(jì)是單表單庫。這里只是對(duì)即時(shí)通訊設(shè)計(jì)上做了一些簡(jiǎn)要的闡述,如有疑問和建議,請(qǐng)?jiān)谠u(píng)論區(qū)回復(fù)。 詳解即時(shí)通訊設(shè)計(jì)實(shí)現(xiàn)(PHP+GatewayWorker+Redis) 需要實(shí)現(xiàn)的功能 一對(duì)一聊天(私聊) 一對(duì)多聊天(群聊) 類似QQ,微信等聊天列表 實(shí)時(shí)消息 顯示 工具...

    luckyyulin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<