app訪問伺服器通過什麼埠
⑴ redis怎麼解決app與伺服器通信
簡介
幾乎所有的主流編程語言都有Redis的客戶端,不考慮Redis非常流行的原因,如果站在技術的角度看原因還有兩個:
客戶端與服務端之間的通信協議是在TCP 協議之上構建的。
Redis制定了 RESP(REdis Serialization Protocol,Redis序列化協議)實現客戶端與服務端的正常交互,這種協議簡單高效,既能夠被機器解析,又容易被人類識別。
- *<參數數量> CR LF
- $<參數 1 的位元組數量> CR LF
- <參數 1 的數據> CR LF
- ...
- $<參數 N 的位元組數量> CR LF
- <參數 N 的數據> CR LF
- SET key value
- *3
- $3
- SET
- $3 # 這里 key 一共三個位元組
- key
- $5 # 這里 value 一共五個位元組
- value
狀態回復(status reply)的第一個位元組是 "+"
錯誤回復(error reply)的第一個位元組是 "-"
整數回復(integer reply)的第一個位元組是 ":"
批量回復(bulk reply)的第一個位元組是 "$"
多條批量回復(multi bulk reply)的第一個位元組是 "*"
- static sds cliFormatReplyTTY(redisReply *r, char *prefix) {
- sds out = sdsempty();
- switch (r->type) {
- // 處理錯誤回復
- case REDIS_REPLY_ERROR:
- out = sdscatprintf(out,"(error) %s ", r->str);
- break;
- // 處理狀態回復
- case REDIS_REPLY_STATUS:
- out = sdscat(out,r->str);
- out = sdscat(out," ");
- break;
- // 處理整數回復
- case REDIS_REPLY_INTEGER:
- out = sdscatprintf(out,"(integer) %lld ",r->integer);
- break;
- // 處理字元串回復
- case REDIS_REPLY_STRING:
- /* If you are procing output for the standard output we want
- * a more interesting output with quoted characters and so forth */
- out = sdscatrepr(out,r->str,r->len);
- out = sdscat(out," ");
- break;
- // 處理 nil
- case REDIS_REPLY_NIL:
- out = sdscat(out,"(nil) ");
- break;
- // 處理多回復
- case REDIS_REPLY_ARRAY:
- if (r->elements == 0) {
- out = sdscat(out,"(empty list or set) ");
- } else {
- unsigned int i, idxlen = 0;
- char _prefixlen[16];
- char _prefixfmt[16];
- sds _prefix;
- sds tmp;
- /* Calculate chars needed to represent the largest index */
- i = r->elements;
- do {
- idxlen++;
- i /= 10;
- } while(i);
- /* Prefix for nested multi bulks should grow with idxlen+2 spaces */
- memset(_prefixlen,' ',idxlen+2);
- _prefixlen[idxlen+2] = '
客戶端和伺服器通過 TCP 連接來進行數據交互, 伺服器默認的埠號為 6379 。
客戶端和伺服器發送的命令或數據一律以 (CRLF)結尾。
發送命令
RESP 在 Redis 1.2 版本中引入, 並最終在 Redis 2.0 版本成為 Redis 伺服器通信的標准方式。
在這個協議中, 所有發送至 Redis 伺服器的參數都是二進制安全(binary safe)的。
RESP 的規定一條命令的格式如下:
命令本身也作為協議的其中一個參數來發送。
例如我們經常執行的 SET 命令,在命令行中我們輸入如下:
使用 RESP 協議規定的格式:
這個命令的實際協議值如下:
"*3 $3 SET $3 key $5 value "
回復
Redis 命令會返回多種不同類型的回復。
通過檢查伺服器發回數據的第一個位元組, 可以確定這個回復是什麼類型:
我們知道redis-cli只能看到最終的執行結果,那是因為redis-cli本身就按照RESP進行結果解析的,所以看不到中間結果,redis-cli.c 源碼對命令結果的解析結構如下: