zoukankan      html  css  js  c++  java
  • 自己动手写Redis客户端(C#实现)2

    Redis请求协议的一般形式:

    *<参数数量> CR LF
    $<参数 1 的字节数量> CR LF
    <参数 1 的数据> CR LF
    ...
    $<参数 N 的字节数量> CR LF
    <参数 N 的数据> CR LF

    备注:CR表示为 ; LF表示

    下面是一个例子:

    *3
    $3
    SET
    $5
    mykey
    $7
    myvalue

    Redis回复

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

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

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

    实现代码(C#)

    1、 通过Socket 连接 Redis:

    // 通过Socket 连接 redis
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     s.Connect("127.0.0.1", 6379);

    2、发送指令

    string key = "SetKeyTest"; // 设置 的key
    string value = "设置的值"; // 设置的值
    StringBuilder sbSend = new StringBuilder();
    sbSend.Append("*3
    "); // 参数数量 3
    string cmd = "SET";
    sbSend.Append("$" + Encoding.UTF8.GetBytes(cmd).Length + "
    "); // 参数1的长度
    sbSend.Append(cmd + "
    ");// 参数1( SET指令 )
    
    sbSend.Append("$" + Encoding.UTF8.GetBytes(key).Length + "
    "); // 参数2的长度
    sbSend.Append("" + key + "
    ");// 参数2(Set 的 Value)
    
    sbSend.Append("$" + Encoding.UTF8.GetBytes(value).Length + "
    "); // 参数3的长度
    sbSend.Append("" + value + "
    ");// 参数3(Set 的 Value)
    Console.WriteLine("发送的命令:");
    Console.Write(sbSend.ToString());
    byte[] data = Encoding.UTF8.GetBytes(sbSend.ToString()); // 把请求转换为byte数组

    3、接收回复

    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

  • 相关阅读:
    Python协程
    Python3常用标准库
    温故而知新--day3
    温故而知新--day2
    解决 WPF 绑定集合后数据变动界面却不更新的问题
    WPF 消息框 TextBox 绑定新数据时让光标和滚动条跳到最下面
    C# 枚举转列表
    真・WPF 按钮拖动和调整大小
    使用 GB28181.Solution + ZLMediaKit + MediaServerUI 进行摄像头推流和播放
    将 .NET Framework 项目转换为 .NET Standard 项目
  • 原文地址:https://www.cnblogs.com/tangruixin/p/7923173.html
Copyright © 2011-2022 走看看