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);
3. 现在写SetString方法,SetString方法我就简单的封装了一下。
string set = SetString("test1", "nihao");
4. SendData()方法
1 /// <summary> 2 /// 拼接发送数据 3 /// </summary> 4 /// <param name="cmd"></param> 5 /// <returns></returns> 6 static string SendData(params string[] cmd) 7 { 8 StringBuilder sb = new StringBuilder(); 9 sb.Append($"*{cmd.Length}\r\n"); 10 foreach (var item in cmd) 11 { 12 sb.Append($"${item.Length}\r\n" + item + "\r\n"); 13 } 14 return sb.ToString(); 15 }
5.GetResponseData()方法。
1 /// <summary> 2 /// 获取返回数据 3 /// </summary> 4 /// <returns></returns> 5 static string GetResponseData() 6 { 7 StringBuilder str = new StringBuilder(); 8 int read = 0; 9 while ((read = buffer.ReadByte()) != -1) 10 { 11 if (read == '\r') 12 { 13 continue; 14 } 15 if (read == '\n') 16 { 17 break; 18 } 19 str.Append((char)read); 20 } 21 var returnData = str.ToString().Replace("$", ""); 22 int lengthCout; 23 if (!int.TryParse(returnData, out lengthCout)) 24 { 25 return str.ToString(); 26 } 27 byte[] by1 = new byte[lengthCout]; 28 buffer.Read(by1, 0, lengthCout); 29 return Encoding.UTF8.GetString(by1); 30 }
6.下面看下GetString方法。
string get = GetString("test1");
7.get和set 方法都完成了。我们在看看passowrd 方法,身份验证。
1 /// <summary> 2 /// AUTH 3 /// </summary> 4 /// <param name="password"></param> 5 /// <returns></returns> 6 static string PassWord(string password) 7 { 8 string data = SendData("AUTH", password); 9 socket.Send(Encoding.UTF8.GetBytes(data)); 10 return GetResponseData(); 11 }
8. 现在我们给redis Server 添加密码来调试下,我现在设置的密码为123456.
9.现在开始调试redis客户端,我吧PassWord方法注释了, 错误提示是,需要身份验证。
10.现在取消注释,添加监视,pw和set 都返回+ok ,get 的值为 nihao。
11。现在输入一个错误的密码试试,比如123456a.
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个参数。
15. 修改后
17.在写一个判断,如果发送的第三个参数不是 wang001 就会报错。我们现在来调试下。
18.在修改下redis 客户端的GetString方法,我们修改wang002
19.现在修改为wang001,现在返回成功了。
20.Set命令是-3 也就是3个参数。我吧他改成-4 ,他这个参数数量是负数,其实一样。
set名还需要多修改一个地方,吧j=3 修改为4。我们来调试一把。
21.setString()方法,我们还按原来的不传递第四个参数,直接报错了。参数的个数错误。
22.现在我们随便添加一个参数,在来调试一把,现在返回成功了,平且也get到数据了。set的第四个参数也可以修改redis源码做个判断,增加安全性。
23.有兴趣的朋友也可以修改其他的命令玩玩,纯属个人爱好。