摘要:命令發(fā)送格式參數(shù)數(shù)量參數(shù)的字節(jié)數(shù)量參數(shù)的數(shù)據(jù)參數(shù)的字節(jié)數(shù)量參數(shù)的數(shù)據(jù)其中表示舉個例子格式化輸出說明開頭,表示有多少個參數(shù),例如表示有個參數(shù)開頭,表示參數(shù)的字節(jié)長度,例如表示有個字節(jié),表示有個字節(jié)每行結(jié)尾通信協(xié)議為回復狀態(tài)回復的第一個字節(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
*開頭,表示有多少個參數(shù),例如*3表示有3個參數(shù)(set, name, wuzhc)
$開頭,表示參數(shù)的字節(jié)長度,例如$3表示set有3個字節(jié),$4表示name有4個字節(jié)
每行rn結(jié)尾
*3 $3 set $4 name $5 wuzhcRedis 回復
狀態(tài)回復(status reply)的第一個字節(jié)是 "+",例如+OK
錯誤回復(error reply)的第一個字節(jié)是 "-",例如-No such key
整數(shù)回復(integer reply)的第一個字節(jié)是 ":",例如:1
批量回復(bulk reply)的第一個字節(jié)是 "$",例如 $5 wuzhc
多條批量回復(multi bulk reply)的第一個字節(jié)是 "*",例如*2 $5 wuzhc $3r age
PHP 實現(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響應內(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ù)個數(shù) $line .= "*" . count($params) . $crlf; // 各個參數(shù)拼裝 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) { // 狀態(tài)回復 case "+": if ($msg == "OK" || $msg == "PONG") { return true; } else { return $msg; } // 錯誤回復 case "-": exit($msg); // 整數(shù)回復 case ":": return $msg; // 批量回復 case "$": // $后面跟數(shù)據(jù)字節(jié)數(shù)(長度) $line = fread($this->_socket, (int)$msg + 2); // 數(shù)據(jù)字節(jié)數(shù) + ( )兩個字節(jié) return mb_substr($line, 0, -2, "8bit"); // 去除最后兩個字節(jié) // 多條批量回復 case "*": // *表示后面有多少個參數(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);
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/25823.html
摘要:用來了解一下通訊協(xié)議原文地址用來了解一下通訊協(xié)議都有那么多包來支撐你使用,那你是否有想過有了服務端,有了客戶端,他們倆是怎樣通訊,又是基于什么通訊協(xié)議做出交互的呢介紹基于我們的目的,本文主要講解和實踐的通訊協(xié)議的客戶端和服務端是通過連接來進 用 Go 來了解一下 Redis 通訊協(xié)議 原文地址:用 Go 來了解一下 Redis 通訊協(xié)議 Go、PHP、Java... 都有那么多包來支...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數(shù)量,最后一條消息內(nèi)容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區(qū)回復。 詳解即時通訊設計實現(xiàn)(PHP+GatewayWorker+Redis) 需要實現(xiàn)的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數(shù)量,最后一條消息內(nèi)容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區(qū)回復。 詳解即時通訊設計實現(xiàn)(PHP+GatewayWorker+Redis) 需要實現(xiàn)的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
閱讀 1961·2023-04-26 02:14
閱讀 3862·2021-11-23 09:51
閱讀 1472·2021-10-13 09:39
閱讀 4056·2021-09-24 10:36
閱讀 3076·2021-09-22 15:55
閱讀 3598·2019-08-30 12:57
閱讀 2098·2019-08-29 15:30
閱讀 2051·2019-08-29 13:19