用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.
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 = ;
while ((read = buffer.ReadByte()) != -)
{
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, , 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.有兴趣的朋友也可以修改其他的命令玩玩,纯属个人爱好。
用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.的更多相关文章
- linux设备驱动第三篇:如何写一个简单的字符设备驱动?
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...
- linux设备驱动第三篇:写一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...
- 利用SpringBoot+Logback手写一个简单的链路追踪
目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...
- (2)自己写一个简单的servle容器
自己写一个简单的servlet,能够跑一个简单的servlet,说明一下逻辑. 首先是写一个简单的servlet,这就关联到javax.servlet和javax.servlet.http这两个包的类 ...
- Linux i2c子系统(一) _动手写一个i2c设备驱动
i2c总线是一种十分常见的板级总线,本文以linux3.14.0为参考, 讨论Linux中的i2c驱动模型并利用这个模型写一个mpu6050的驱动, 最后在应用层将mpu6050中的原始数据读取出来 ...
- 手写一个简单的starter组件
spring-boot中有很多第三方包,都封装成starter组件,在maven中引用后,启动springBoot项目时会自动装配到spring ioc容器中. 思考: 为什么我们springBoot ...
- 手把手教你从零写一个简单的 VUE
本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 如何写一个简单的http服务器
最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...
随机推荐
- 【校招面试 之 C/C++】第11题 C++ 纯虚函数
1.纯虚函数 成员函数的形参后面写上=0,则成员函数为纯虚函数. 纯虚函数声明: virtual 函数类型 函数名 (参数表列) = 0: class Person { virtual void Di ...
- ios 进入后台 一段时间在进入前台 动画消失
http://www.cnblogs.com/YouXianMing/p/3670846.html
- 【原创】有关Silverlight中自动生成的类中 没有WCF层edmx模型新加入的对象 原因分析。
前端页面层: 编译老是不通过,报如下如所示错误: -- 然后下意识的查了下 生成的cs文件,没有搜到根据edmx 生成的 对应的类. 结果整理: 1.尽管在 edmx 模 ...
- maven 发布打包部署 命令
一.配置好jdk 二.下载安装maven http://maven.apache.org/download.cgi 三.添加环境变量 1. 添加 M2_HOME 和 MAVEN_HOME 环境变量到 ...
- ThinkPHP5路由图解
- geoserver 开发2
先上源码下载 上一章我们介绍了GeoServer源码分析的必要性(这个就见仁见智了)以及诸项准备工作,并且在最后还给出了OWS请求处理流程的伪代码. 这一章我们来看看要注册自己的服务需要做哪些工作.假 ...
- 《Ubuntu标准教程》学习总结
第6章 Shell Shell就是一个命令解释器,负责完成用户与内核之间的交互. 目前流行电Shell主要有:Bourne Shell( sh ).Bourne Again Shell( Bash ) ...
- Codeforces 681C. Heap Operations 优先队列
C. Heap Operations time limit per test:1 second memory limit per test:256 megabytes input:standard i ...
- linux bluez
Linux下开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的Affix, Axis公司的OpenBT和官方协议栈BlueZ.我们主要对Bluez进行探讨. BlueZ基础代码 ...
- Android教程:wifi热点问题
http://www.linuxidc.com/Linux/2012-05/60718.htm 现在很多移动设备都提供wifi hostpot功能,使用方便,也省下了原来无线路由器的成本.wifi和w ...