用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数....

本文介绍如何使用 C# 实现 Redis 客户端,包括连接 Redis 服务器、设置及获取键值、身份验证、命令发送及响应处理等核心功能,并探讨了通过修改 Redis 命令参数数量来增加安全性的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.有兴趣的朋友也可以修改其他的命令玩玩,纯属个人爱好。

 

 

  

转载于:https://www.cnblogs.com/myisceo/p/6759831.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值