用.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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式系统的Raft算法

转载自 分布式系统的Raft算法 过去, Paxos一直是分布式协议的标准&#xff0c;但是Paxos难于理解&#xff0c;更难以实现&#xff0c;Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。 来自Stanford的新的分布式协议研究称为Raft&#xff0c;它是一个为真实世界应…

拆分:分解单块系统——《微服务设计》读书笔记

通常&#xff0c;我们可能已有有一个巨大的单块系统&#xff0c;如何实现微服务&#xff0c;我们需要把它分解。 从哪里开始拆分&#xff1a;接缝 接缝&#xff1a;从接缝处可以抽取相对独立的一部分代码&#xff0c;对这部分代码的修改不会影响系统的其他部分。这些接缝就可以…

winfrom实现简单计算器V2版本

前面&#xff0c;使用winform实现了个简单的计算器&#xff0c;今天&#xff0c;再来给大家看一个稍微复杂点的计算器&#xff0c;效果图如下&#xff1a; 包括归零&#xff0c;退格&#xff0c;加减乘除都已经实现&#xff0c;如果想要继续扩展的可以在稍微改改即可。 现在看…

ACID中C与CAP定理中C的区别

转载自 ACID中C与CAP定理中C的区别 ACID和CAP定理中都有C&#xff0c;代表Consistent一致性&#xff0c;很多人容易将这两个C混为一谈&#xff0c;其实这两个一致性是有区别的。 事务的定义是一系列操作要么全部成功&#xff0c;要么全部不成功&#xff0c;数据库的事务机制是…

winform通过ListView绑定数据库数据源

来&#xff0c;我们开始拉窗体&#xff0c;和我一样的这个就可以&#xff1a; 很简单&#xff0c;在窗体里面只放一个ListView控件即可&#xff0c;然后点击ListView的属性Columns 分别在Text里面写用户名和密码&#xff0c;点击确定。 然后设置显示视图View为Details&…

理解C# 4 dynamic(4) – 让人惊艳的Clay

一&#xff0c;多种方式初始化对象 1, 最简单的对象构建和初始化 dynamic New new ClayFactory();var person New.Person(); person.FirstName "Louis"; person.LastName "Dejardin"; 注意这里的Person并不是一个具体的&#xff0c;实际存在的类或者…

配置struts.xml时extends=struts-default会报错,原因和解决

提示&#xff1a;此种解决方法只适用于Intellij IDEA&#xff0c;MyEclipse或者Eclipse还得另寻它法&#xff0c;但估计原因应该是类似的。 在Intellij IDEA 2017使用Struts2框架时&#xff0c;若新建项目时并未导入Struts2框架而是在后期手动新建lib目录导入Struts2框架后&…

React生命周期(新)

三个标红的需要前面加上UNSAFE_ 三个常用的组件

发力企业级市场,微软Hololens开辟了一条VR新道路

近日微软Hololens可谓是动作频频&#xff0c;2月份Hololens与BGC Engineering合作&#xff0c;从矿山规划到泥石流建模&#xff0c;该应用程序可帮助BGC Engineering及其客户可视化一个场景并解决工程问题。 3月份HoloLens与Cigna展开医疗合作&#xff0c;将Hololens用于健康检…

写给工程师的10条精进原则

转载自 写给工程师的10条精进原则 引言 时间回到8年前&#xff0c;我人生中的第一份实习工作&#xff0c;是在某互联网公司的无线搜索部做一个C工程师。当时的我可谓意气风发&#xff0c;想要大干一场&#xff0c;结果第一次上线就写了人生中第一个CaseStudy。由于对部署环境…

Struts2下创建自定义类型转换器(表单中日期的处理)

在表单提交中需要有日期的输入&#xff0c;默认的Struts2处理机制可能不能满足需求&#xff0c;需要自定义一下类型转换器。如&#xff1a; String----->java.util.Date&#xff1a;输入 java.util.Date------>String:输出&#xff1a;查询显示&#xff0c;输出错误回显 …

部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

一.CI&#xff08;Continuous Integration&#xff09;简介 CI规则1&#xff1a;尽量频繁地把代码签入到分支中以进行集成 CI规则2&#xff1a;不光要对语法进行验&#xff0c;也要提供一系列的自动化来验证 CI规则3&#xff1a;CI失败后&#xff0c;要把修复CI当做第一优先级的…

React中的唯一标识key(用index VS id)和key的选择

1. 虚拟DOM中key的作用&#xff1a;1). 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。2). 详细的说: 当状态中的数据发生变化时&#xff0c;react会根据【新数据】生成【新的虚拟DOM】, 随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较&#x…

Android中ImageView的scaleType 属性说明。

ImageView是Android中最常用的控件之一&#xff0c;在使用ImageView的时候&#xff0c;必不可少的会使用到scaleType属性&#xff0c;该属性指定了你的ImageView如何显示图片。包括是否进行缩放&#xff0c;等比缩放&#xff0c;缩放后显示的位置&#xff0c; Android中提供了八…

支付渠道参数如何设计成路由化配置

转载自 支付渠道参数如何设计成路由化配置 今天我们来探讨在搭建支付系统时一个比较关键的问题&#xff1a;渠道参数路由化配置如何设计&#xff1f; 在开发支付系统的时候&#xff0c;我们经常会涉及到对接多个支付渠道&#xff0c;除常见的支付宝、微信外可能还会根据不同的…

分布式数据访问服务之1—华山论剑篇

业界主流的互联网架构中&#xff0c;分布式服务框架、分布式数据访问服务、消息队列服务、服务网关(API)、分布式事务等都是核心的组件和框架。 当我们的系统规模越来越大&#xff0c;从几台服务器扩展到几十台、几百台、上千台&#xff0c;传统的烟囱式的、大集中式系统架构&…

漫画:什么是快速排序?(完整版)

转载自 漫画&#xff1a;什么是快速排序&#xff1f;&#xff08;完整版&#xff09; 同冒泡排序一样&#xff0c;快速排序也属于交换排序&#xff0c;通过元素之间的比较和交换位置来达到排序的目的。 不同的是&#xff0c;冒泡排序在每一轮只把一个元素冒泡到数列的一端&a…