本身動手寫Redis客戶端(C#實現)2 - SET請求和狀態回覆(set)

Redis請求協議的通常形式:redis

*<參數數量> CR LF
$<參數 1 的字節數量> CR LF
<參數 1 的數據> CR LF
...
$<參數 N 的字節數量> CR LF
<參數 N 的數據> CR LF

備註:CR表示爲\r; LF表示\n數組

下面是一個例子:服務器

*3
$3
SET
$5
mykey
$7
myvalue

Redis回覆

Redis 命令會返回多種不一樣類型的回覆。ui

經過檢查服務器發回數據的第一個字節, 能夠肯定這個回覆是什麼類型:spa

  • 狀態回覆(status reply)的第一個字節是 "+"
  • 錯誤回覆(error reply)的第一個字節是 "-"
  • 整數回覆(integer reply)的第一個字節是 ":"
  • 批量回復(bulk reply)的第一個字節是 "$"
  • 多條批量回復(multi bulk reply)的第一個字節是 "*"

實現代碼(C#)

一、 經過Socket 鏈接 Redis:code

// 經過Socket 鏈接 redis
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 s.Connect("127.0.0.1", 6379);

二、發送指令blog

string key = "SetKeyTest"; // 設置 的key
string value = "設置的值"; // 設置的值
StringBuilder sbSend = new StringBuilder();
sbSend.Append("*3\r\n"); // 參數數量 3
string cmd = "SET";
sbSend.Append("$" + Encoding.UTF8.GetBytes(cmd).Length + "\r\n"); // 參數1的長度
sbSend.Append(cmd + "\r\n");// 參數1( SET指令 )

sbSend.Append("$" + Encoding.UTF8.GetBytes(key).Length + "\r\n"); // 參數2的長度
sbSend.Append("" + key + "\r\n");// 參數2(Set 的 Value)

sbSend.Append("$" + Encoding.UTF8.GetBytes(value).Length + "\r\n"); // 參數3的長度
sbSend.Append("" + value + "\r\n");// 參數3(Set 的 Value)
Console.WriteLine("發送的命令:");
Console.Write(sbSend.ToString());
byte[] data = Encoding.UTF8.GetBytes(sbSend.ToString()); // 把請求轉換爲byte數組

三、接收回復get

byte[] result = new byte[1024];
int resultLength =  s.Receive(result); // 接收回復

// 根據接收到的數據長度從新組裝一個結果
byte[] newResult = new byte[resultLength];
for (int i = 0; i < resultLength; i++)
{
newResult[i] = result[i];
}
string strResult =  Encoding.UTF8.GetString(newResult);  // 把結果轉換爲string
Console.Write(strResult);
Console.Write(strResult.Trim() == "+OK" ? "設置成功!": "設置失敗!"); // 判斷設置是否成功

 

執行效果

W}RN{0W_}Q[]6`3CE6ZHBQH

 

image

相關文章
相關標籤/搜索