摘要:命令發(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
*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é)尾
*3 $3 set $4 name $5 wuzhcRedis 回復(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
摘要:用來了解一下通訊協(xié)議原文地址用來了解一下通訊協(xié)議都有那么多包來支撐你使用,那你是否有想過有了服務(wù)端,有了客戶端,他們倆是怎樣通訊,又是基于什么通訊協(xié)議做出交互的呢介紹基于我們的目的,本文主要講解和實(shí)踐的通訊協(xié)議的客戶端和服務(wù)端是通過連接來進(jìn) 用 Go 來了解一下 Redis 通訊協(xié)議 原文地址:用 Go 來了解一下 Redis 通訊協(xié)議 Go、PHP、Java... 都有那么多包來支...
摘要:即時(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í)消息 顯示 工具...
摘要:即時(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í)消息 顯示 工具...
閱讀 1813·2023-04-26 02:14
閱讀 3738·2021-11-23 09:51
閱讀 1390·2021-10-13 09:39
閱讀 3980·2021-09-24 10:36
閱讀 3020·2021-09-22 15:55
閱讀 3524·2019-08-30 12:57
閱讀 2044·2019-08-29 15:30
閱讀 1988·2019-08-29 13:19