用.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);
3. 現在寫SetString方法,SetString方法我就簡單的封裝了一下。
? ?string set = SetString("test1", "nihao");?
?
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"); ?
?
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.
??
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.有興趣的朋友也可以修改其他的命令玩玩,純屬個人愛好。
原文地址:http://www.cnblogs.com/myisceo/p/6759831.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的用.netcore写一个简单redis驱动,调试windows版本的redis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软正在用实际行动告诉你: 拥抱开源,微
- 下一篇: 拆分:分解单块系统——《微服务设计》读书