摘要:命令發送格式參數數量參數的字節數量參數的數據參數的字節數量參數的數據其中表示舉個例子格式化輸出說明開頭,表示有多少個參數,例如表示有個參數開頭,表示參數的字節長度,例如表示有個字節,表示有個字節每行結尾通信協議為回復狀態回復的第一個字節是,
redis命令發送格式:
*<參數數量> CRLF
$<參數 1 的字節數量> CRLF
<參數 1 的數據> CRLF
...
$<參數 N 的字節數量> CRLF
<參數 N 的數據> CRLF
其中CRLF表示 rn
*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 wuzhcRedis 回復
狀態回復(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、PHP、Java... 都有那么多包來支...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
閱讀 1794·2023-04-26 02:14
閱讀 3719·2021-11-23 09:51
閱讀 1381·2021-10-13 09:39
閱讀 3963·2021-09-24 10:36
閱讀 3009·2021-09-22 15:55
閱讀 3511·2019-08-30 12:57
閱讀 2036·2019-08-29 15:30
閱讀 1980·2019-08-29 13:19