用.netcore写一个简单redis驱动,调试windows版本的redis
1. 下載windows版本的redis
2.開(kāi)發(fā)環(huán)境vs2017 ?新建一個(gè) .net core控制臺(tái)。 ? ? ?
?? 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. 現(xiàn)在寫SetString方法,SetString方法我就簡(jiǎn)單的封裝了一下。
? ?string set = SetString("test1", "nihao");?
?
4. SendData()方法
/// <summary>
? ? ? ? /// 拼接發(fā)送數(shù)據(jù)
? ? ? ? /// </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>
? ? ? ? /// 獲取返回?cái)?shù)據(jù)
? ? ? ? /// </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 方法都完成了。我們?cè)诳纯磒assowrd 方法,身份驗(yàn)證。
/// <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. 現(xiàn)在我們給redis Server 添加密碼來(lái)調(diào)試下,我現(xiàn)在設(shè)置的密碼為123456.
??
9.現(xiàn)在開(kāi)始調(diào)試redis客戶端,我吧PassWord方法注釋了, 錯(cuò)誤提示是,需要身份驗(yàn)證。
10.現(xiàn)在取消注釋,添加監(jiān)視,pw和set 都返回+ok ?,get 的值為 nihao。
11。現(xiàn)在輸入一個(gè)錯(cuò)誤的密碼試試,比如123456a.
?
12. 我們?cè)诳纯磩h除命令.
/// <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.過(guò)期時(shí)間方法。
/// <summary>
? ? ? ? /// 過(guò)期時(shí)間
? ? ? ? /// </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.下面我們來(lái)點(diǎn)好玩的,修改get命令的參數(shù)數(shù)量,也相當(dāng)添加一個(gè)安全驗(yàn)證。
下圖是redis 的get命令,我現(xiàn)在改下,?{"get",getCommand,2,"rF",0,NULL,1,1,1,0,0} ,其中的 2 是參數(shù)的數(shù)量,我吧他改成3, get命令就必須傳遞3個(gè)參數(shù)。
15. 修改后
?
17.在寫一個(gè)判斷,如果發(fā)送的第三個(gè)參數(shù)不是 wang001 就會(huì)報(bào)錯(cuò)。我們現(xiàn)在來(lái)調(diào)試下。
?
?18.在修改下redis 客戶端的GetString方法,我們修改wang002
?
19.現(xiàn)在修改為wang001,現(xiàn)在返回成功了。
?
?20.Set命令是-3 也就是3個(gè)參數(shù)。我吧他改成-4 ?,他這個(gè)參數(shù)數(shù)量是負(fù)數(shù),其實(shí)一樣。
??
set名還需要多修改一個(gè)地方,吧j=3 修改為4。我們來(lái)調(diào)試一把。
?
21.setString()方法,我們還按原來(lái)的不傳遞第四個(gè)參數(shù),直接報(bào)錯(cuò)了。參數(shù)的個(gè)數(shù)錯(cuò)誤。
?
?22.現(xiàn)在我們隨便添加一個(gè)參數(shù),在來(lái)調(diào)試一把,現(xiàn)在返回成功了,平且也get到數(shù)據(jù)了。set的第四個(gè)參數(shù)也可以修改redis源碼做個(gè)判斷,增加安全性。
?
23.有興趣的朋友也可以修改其他的命令玩玩,純屬個(gè)人愛(ài)好。
原文地址:http://www.cnblogs.com/myisceo/p/6759831.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的用.netcore写一个简单redis驱动,调试windows版本的redis的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微软正在用实际行动告诉你: 拥抱开源,微
- 下一篇: 拆分:分解单块系统——《微服务设计》读书