用.netcore写一个简单redis驱动,调试windows版本的redis

1. 下载windows版本的redis

2.开发环境vs2017  新建一个 .net core控制台。      

   private static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);    

  private static BufferedStream buffer = null;

 socket.NoDelay = true;
 socket.SendTimeout = 5000;
 socket.Connect("127.0.0.1", 6379);
 buffer = new BufferedStream(new NetworkStream(socket), 10 * 1024);

640?wx_fmt=png

3. 现在写SetString方法,SetString方法我就简单的封装了一下。

  640?wx_fmt=png

   string set = SetString("test1", "nihao"); 

 640?wx_fmt=png

4. SendData()方法 

/// <summary>

        /// 拼接发送数据

        /// </summary>

        /// <param name="cmd"></param>

        /// <returns></returns>

        static string SendData(params string[] cmd)

        {

            StringBuilder sb = new StringBuilder();

            sb.Append($"*{cmd.Length}\r\n");

            foreach (var item in cmd)

            {

                sb.Append($"${item.Length}\r\n" + item + "\r\n");

            }

            return sb.ToString();

        }

5.GetResponseData()方法。

/// <summary>

        /// 获取返回数据

        /// </summary>

        /// <returns></returns>

        static string GetResponseData()

        {

            StringBuilder str = new StringBuilder();

            int read = 0;

            while ((read = buffer.ReadByte()) != -1)

            {

                if (read == '\r')

                {

                    continue;

                }

                if (read == '\n')

                {

                    break;

                }

                str.Append((char)read);

            }

            var returnData = str.ToString().Replace("$", "");

            int lengthCout;

            if (!int.TryParse(returnData, out lengthCout))

            {

                return str.ToString();

            }

            byte[] by1 = new byte[lengthCout];

            buffer.Read(by1, 0, lengthCout);

            return Encoding.UTF8.GetString(by1);

        }

6.下面看下GetString方法。  

string get = GetString("test1");  

640?wx_fmt=png

 

7.get和set 方法都完成了。我们在看看passowrd 方法,身份验证。

/// <summary>

        /// AUTH

        /// </summary>

        /// <param name="password"></param>

        /// <returns></returns>

        static string PassWord(string password)

        {

            string data = SendData("AUTH", password);

            socket.Send(Encoding.UTF8.GetBytes(data));

            return GetResponseData();

        }

 8. 现在我们给redis Server 添加密码来调试下,我现在设置的密码为123456.

  640?wx_fmt=png

9.现在开始调试redis客户端,我吧PassWord方法注释了, 错误提示是,需要身份验证。

  640?wx_fmt=png

10.现在取消注释,添加监视,pw和set 都返回+ok  ,get 的值为 nihao。

  640?wx_fmt=png 

11。现在输入一个错误的密码试试,比如123456a.

 640?wx_fmt=png

12. 我们在看看删除命令.

/// <summary>

        /// delete命令

        /// </summary>

        /// <param name="key"></param>

        /// <returns></returns>

        static string DeleteKey(string key)

        {

            string data=SendData("DEL", key);

            socket.Send(Encoding.UTF8.GetBytes(data));

            return GetResponseData();

        }

13.过期时间方法。 

/// <summary>

        /// 过期时间

        /// </summary>

        /// <param name="key"></param>

        /// <returns></returns>

        static string ExpirationTime(string key,int seconds)

        {

            string data = SendData("EXPIRE", key,seconds.ToString());

            socket.Send(Encoding.UTF8.GetBytes(data));

            return GetResponseData();

        }

14.下面我们来点好玩的,修改get命令的参数数量,也相当添加一个安全验证。

下图是redis 的get命令,我现在改下, {"get",getCommand,2,"rF",0,NULL,1,1,1,0,0} ,其中的 2 是参数的数量,我吧他改成3, get命令就必须传递3个参数。

  

640?wx_fmt=png

15. 修改后

640?wx_fmt=png

 

17.在写一个判断,如果发送的第三个参数不是 wang001 就会报错。我们现在来调试下。

640?wx_fmt=png

 

 18.在修改下redis 客户端的GetString方法,我们修改wang002

  640?wx_fmt=png

 640?wx_fmt=png

19.现在修改为wang001,现在返回成功了。

640?wx_fmt=png640?wx_fmt=png

 

 20.Set命令是-3 也就是3个参数。我吧他改成-4  ,他这个参数数量是负数,其实一样。

640?wx_fmt=png  640?wx_fmt=png

set名还需要多修改一个地方,吧j=3 修改为4。我们来调试一把。

640?wx_fmt=png

 

21.setString()方法,我们还按原来的不传递第四个参数,直接报错了。参数的个数错误。

  640?wx_fmt=png640?wx_fmt=png

 

 22.现在我们随便添加一个参数,在来调试一把,现在返回成功了,平且也get到数据了。set的第四个参数也可以修改redis源码做个判断,增加安全性。

640?wx_fmt=png640?wx_fmt=png

 

23.有兴趣的朋友也可以修改其他的命令玩玩,纯属个人爱好。

原文地址:http://www.cnblogs.com/myisceo/p/6759831.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

640?wx_fmt=jpeg