国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Redis 通訊協議

weizx / 1558人閱讀

摘要:命令發送格式參數數量參數的字節數量參數的數據參數的字節數量參數的數據其中表示舉個例子格式化輸出說明開頭,表示有多少個參數,例如表示有個參數開頭,表示參數的字節長度,例如表示有個字節,表示有個字節每行結尾通信協議為回復狀態回復的第一個字節是,

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結尾

通信協議為:
*3
$3
set
$4
name
$5
wuzhc
Redis 回復

狀態回復(status reply)的第一個字節是 "+",例如+OK

錯誤回復(error reply)的第一個字節是 "-",例如-No such key

整數回復(integer reply)的第一個字節是 ":",例如:1

批量回復(bulk reply)的第一個字節是 "$",例如 $5 wuzhc

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

PHP 實現Redis客戶端
_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 格式化為 *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;
        }

        // 參數個數
        $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); // 數據字節數 + (
)兩個字節
                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);

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25823.html

相關文章

  • 用 Go 來了解一下 Redis 通訊協議

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

    cnsworder 評論0 收藏0
  • PHP即時通訊設計實現

    摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...

    asoren 評論0 收藏0
  • PHP即時通訊設計實現

    摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...

    luckyyulin 評論0 收藏0

發表評論

0條評論

weizx

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<