【轮子狂魔】手把手教你自造Redis Client

为什么做Redis Client?

Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作。

而目前用的比较广泛的 ServiceStack.Redis 不学好,居然开始收费了。

作为轮子狂魔,是可忍孰不可忍啊。于是我决定自己造轮子了。

Redis通信协议

先给个Redis官方的通信协议地址:http://redisdoc.com/topic/protocol.html

关键是我截图的部分,我们可以得到以下几个信息:

1.tcp协议

2.默认端口6379

3.命令以 \r\n 结尾

实现Redis交互(Get、Set)

Set命令说明:http://redisdoc.com/string/set.html

Get命令说明:http://redisdoc.com/string/get.html

C#的Tcp交互选用TcpClient

  实现Set指令

代码意图大概说一下:

1.创建TcpClient

2.连接Redis (127.0.0.1:6379)

3.发送指令 set test csharp\r\n (注意\r\n是一开始通信协议就提到的,命令以\r\n结尾)

4.使用UTF8来编码和解码

5.接收返回信息

PS:get指令类似,我就不贴出来了

 1             var tcpClient = new System.Net.Sockets.TcpClient();
 2
 3             tcpClient.Connect("127.0.0.1", 6379);
 4
 5             string setCommand = "set test csharp\r\n";
 6             tcpClient.Client.Send(Encoding.UTF8.GetBytes(setCommand));
 7             System.Diagnostics.Trace.Write(setCommand);
 8             byte[] buffer = new byte[256];
 9             tcpClient.Client.Receive(buffer);
10             System.Diagnostics.Trace.Write(Encoding.UTF8.GetString(buffer).Replace("\0", ""));    

  想象中的调用方式

1.第一行有个关键思维是单例模式,即我希望全局只有一个Redis Client。(多个的话可以直接用RedisClient)

2.RedisClient的连接地址可自由指定

3. 从单例中取出Client就可以简单粗暴的上ta。client.Set(key,value)

1             var client = RedisSingleton.GetInstance.Client = new Client.RedisClient("127.0.0.1", 6379);
2             client.Set("test", "Framework.Redis");
3             var value = client.Get("test");
4             Trace.Write("client get:" + value);
  重构一个RedisManager和RedisClient

RedisManager 其实就是个简单的单例模式,封装了一个全局唯一的对象而已。如果不想全局唯一,直接用RedisClient就可以了。

 1     public class RedisSingleton
 2     {
 3         #region 单例
 4
 5         private static RedisSingleton _redisSingleton = null;
 6         private static object _locker = new object();
 7
 8         public static RedisSingleton GetInstance
 9         {
10             get
11             {
12                 if (_redisSingleton == null)
13                 {
14                     lock (_locker)
15                     {
16                         if (_redisSingleton == null)
17                         {
18                             _redisSingleton = new RedisSingleton();
19                         }
20                     }
21                 }
22
23                 return _redisSingleton;
24             }
25         }
26
27         #endregion
28
29         public RedisClient Client { get; set; }
30     }

RedisClient 是真正的与Redis交互的代码(因为这只是个简单粗暴的Demo,所以代码不太美观,见谅!之后会继续完善我的这个自造的Redis)

 1     public class RedisClient
 2     {
 3         private TcpClient _tcpClient = null;
 4
 5         public RedisClient(string serverIP, int serverPort)
 6         {
 7             _tcpClient = new TcpClient();
 8             _tcpClient.Connect(serverIP, serverPort);
 9         }
10
11         public void Set(string key, string value)
12         {
13             string setCommand = "set " + key + " " + value + "\r\n";
14             _tcpClient.Client.Send(Encoding.UTF8.GetBytes(setCommand));
15             Logger.Info(setCommand);
16             var result = GetRaw();
17             if (result != "+OK")
18             {
19                 throw new Exception("redis error:" + result);
20             }
21         }
22
23         public string Get(string key)
24         {
25             string setCommand = "get " + key + "\r\n";
26             _tcpClient.Client.Send(Encoding.UTF8.GetBytes(setCommand));
27             Logger.Info(setCommand);
28             string value = GetRaw();
29             Logger.Info("get " + key + " value:" + value);
30             return value.Split(new string[] { "\r\n" }, StringSplitOptions.None)[1];
31         }
32
33         private string GetRaw()
34         {
35             byte[] buffer = new byte[256];
36             _tcpClient.Client.Receive(buffer);
37             string value = Encoding.UTF8.GetString(buffer).Replace("\0", "").TrimEnd("\r\n".ToCharArray());
38             return value;
39         }
40     }

最后是大家喜欢的广告环节

全部代码就这么多我就不分享我的oschina上的项目地址了,因为目前正在做一个开源的mvc项目需要使用Redis,所以自己造了这么个轮子。

如果你有兴趣加入我们,请加群:7424099

哦,不好意思,补上有图有真相

时间: 2024-08-04 08:11:03

【轮子狂魔】手把手教你自造Redis Client的相关文章

手把手教你简单接入微信SDK

就看微信现在这么火的样子,如果你的APP不接入微信的SDK好像就有点脱离了时代大车轮一样.一个成功的APP,不单单凭借着一个好的想法,一个好的功能,最主要还是用户量.用户量就好像是水,我们的APP就一艘船,而好的推广就像是好的帆.这艘船我可以造得很大,很华丽,但是少了水,我们仅仅是摆设:少了帆,我们仅仅靠桨来划,速度也太慢.因此接入微信SDK的功能也是必不可少,相信有点才能的领导都会要求加上这一个功能.好了,言归正传,正式开始手把手教你简单接入微信SDK. 1.首先我们需要建立一个android

手把手教你写专利申请书/怎样申请专利

手把手教你写专利申请书·怎样申请专利 摘要小前言(一)申请前的准备工作    1.申请前查询    2.其它方面的考虑    3.申请文件准备(二)填写专利申请系列文档    1.实际操作步骤    2.详细操作    3.经验分享.注意事项(三)关于费用(四)其它的话參考资源提示常见问题的问与答 摘要: 怎样写好专利申请?由于非常多专利申请人都是第一次申请,因此,可能有一种神奇和些许恐惧.本文写的是怎样写专利申请书,手把手教你写专利申请并提供申请专利时的注意事项,专利申请费用及费用减缓等相关參

【轮子狂魔】抛弃IIS,打造个性的Web Server - WebAPI/Lua/MVC(附带源码)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 引言 此篇是<[轮子狂魔]抛弃IIS,向天借个HttpListener - 基础篇(附带源码)>的续篇,也可以说是提高篇,如果你对HttpListener不甚了解的话,建议先看下基础篇. 这次玩的东西有点多了,大致分为如下几个方向: 1.支持

【轮子狂魔】打造简易无配置的IoC

如何指定Business Event和Command之间的关系? 既然是基于惯例优先原则,那么我们首先需要定义一个惯例: 1.调度事件和调度处理器之间是一对多关系(多对多的话,相信你看完了以后应该会知道怎么改的). 2.所有业务事件(Event)要以调度事件为基类,业务指令(Command)的调度处理器特性需要指定可处理的调度事件. 1 /// <summary> 2 /// 调度事件 3 /// </summary> 4 [AttributeUsage(AttributeTarg

手把手教你写专利申请书/如何申请专利

http://blog.csdn.net/johnsuna/article/details/3492145 手把手教你写专利申请书·如何申请专利 摘要小前言(一)申请前的准备工作    1.申请前查询    2.其他方面的考虑    3.申请文件准备(二)填写专利申请系列文档    1.实际操作步骤    2.具体操作    3.经验分享.注意事项(三)关于费用(四)其他的话参考资源提示常见问题的问与答 摘要: 如何写好专利申请?由于很多专利申请人都是第一次申请,因此,可能有一种神秘和些许恐惧.

《手把手教你》系列进阶篇之2-python+ selenium自动化测试 - python基础扫盲(详细教程)

1. 简介 这篇文章主要是分享讲解一下,如何封装自己用到的方法和类.以便方便自己和别人的调用,这样就可以避免重复地再造轮子. 封装(Encapsulation)是面向对象的三大特征之一(另外两个是继承和多态),它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问. 就好比使用计算机,我们只需要使用计算机提供的键盘,就可以达到操作计算机的目的,至于在敲击键盘时计算机内部是如何工作,我们根本不需要知道. 封装机制保证了类内部

Android开发之手把手教你写ButterKnife框架(二)

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开发之手把手教你写ButterKnife框架(一)我们讲了ButterKnife是什么.ButterKnife的作用和功能介绍以及ButterKnife的实现原理. 本篇博客主要讲在android studio中如何使用apt. 一.新建个项目, 然后创建一个module名叫processor 新建m

手把手教你实现Spring ioc

手把手教你实现Spring ioc "Don't call us, we'll call you(不要联系我,我会主动联系你)" 这是好莱坞很经典的一句话,应用在ioc(控制反转)领域,发现理解起来相得益彰--你作为用户不需要控制业务实体的生成,交给我容器来控制,这就是控制反转.不过,这样理解起来也有点麻烦,套用面向对象大师Martin Fowler的说法更为贴切: "Dependency Inversion(依赖注入)" 当容器中所有的实体bean 都被管理起来的

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属