查看: 323|回复: 0

[.NET源码] 自己动手写Redis客户端(C#实现)2 - SET请求和状态回复(set)

发表于 2017-12-6 08:00:04

Redis请求协议的一般形式:

  1. *<参数数量> CR LF
  2. $<参数 1 的字节数量> CR LF
  3. <参数 1 的数据> CR LF
  4. ...
  5. $<参数 N 的字节数量> CR LF
  6. <参数 N 的数据> CR LF
复制代码

备注:CR表示为\r; LF表示\n

下面是一个例子:

  1. *3
  2. $3
  3. SET
  4. $5
  5. mykey
  6. $7
  7. myvalue
复制代码
Redis回复

Redis 命令会返回多种不同类型的回复。

通过检查服务器发回数据的第一个字节, 可以确定这个回复是什么类型:

  • 状态回复(status reply)的第一个字节是 "+"
  • 错误回复(error reply)的第一个字节是 "-"
  • 整数回复(integer reply)的第一个字节是 ":"
  • 批量回复(bulk reply)的第一个字节是 "$"
  • 多条批量回复(multi bulk reply)的第一个字节是 "*"
实现代码(C#

1、 通过Socket 连接 Redis:

  1. // 通过Socket 连接 redis
  2. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  3. s.Connect("127.0.0.1", 6379);
复制代码

2、发送指令

  1. string key = "SetKeyTest"; // 设置 的key
  2. string value = "设置的值"; // 设置的值
  3. StringBuilder sbSend = new StringBuilder();
  4. sbSend.Append("*3\r\n"); // 参数数量 3
  5. string cmd = "SET";
  6. sbSend.Append("$" + Encoding.UTF8.GetBytes(cmd).Length + "\r\n"); // 参数1的长度
  7. sbSend.Append(cmd + "\r\n");// 参数1( SET指令 )
  8. sbSend.Append("$" + Encoding.UTF8.GetBytes(key).Length + "\r\n"); // 参数2的长度
  9. sbSend.Append("" + key + "\r\n");// 参数2(Set 的 Value)
  10. sbSend.Append("$" + Encoding.UTF8.GetBytes(value).Length + "\r\n"); // 参数3的长度
  11. sbSend.Append("" + value + "\r\n");// 参数3(Set 的 Value)
  12. Console.WriteLine("发送的命令:");
  13. Console.Write(sbSend.ToString());
  14. byte[] data = Encoding.UTF8.GetBytes(sbSend.ToString()); // 把请求转换为byte数组
复制代码

3、接收回复

  1. byte[] result = new byte[1024];
  2. int resultLength = s.Receive(result); // 接收回复
  3. // 根据接收到的数据长度重新组装一个结果
  4. byte[] newResult = new byte[resultLength];
  5. for (int i = 0; i < resultLength; i++)
  6. {
  7. newResult[i] = result[i];
  8. }
  9. string strResult = Encoding.UTF8.GetString(newResult); // 把结果转换为string
  10. Console.Write(strResult);
  11. Console.Write(strResult.Trim() == "+OK" ? "设置成功!": "设置失败!"); // 判断设置是否成功
复制代码

执行效果

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

image



回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条