设为首页 收藏本站
查看: 1920|回复: 0

[经验分享] 【轮子狂魔】手把手教你自造Redis Client

[复制链接]

尚未签到

发表于 2015-7-19 12:35:18 | 显示全部楼层 |阅读模式
为什么做Redis Client?
  Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作。
  而目前用的比较广泛的 ServiceStack.Redis 不学好,居然开始收费了。
  作为轮子狂魔,是可忍孰不可忍啊。于是我决定自己造轮子了。
  

Redis通信协议
  先给个Redis官方的通信协议地址:http://redisdoc.com/topic/protocol.html
DSC0000.jpg
  关键是我截图的部分,我们可以得到以下几个信息:
  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指令类似,我就不贴出来了


DSC0001.gif DSC0002.gif


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", ""));   
View Code  

想象中的调用方式
  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     }
View Code  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     }
View Code  

最后是大家喜欢的广告环节
  全部代码就这么多我就不分享我的oschina上的项目地址了,因为目前正在做一个开源的mvc项目需要使用Redis,所以自己造了这么个轮子。
  如果你有兴趣加入我们,请加群:7424099
  
  哦,不好意思,补上有图有真相
DSC0003.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88273-1-1.html 上篇帖子: ServiceStack.Redis之IRedisClient<第三篇> 下篇帖子: Redis 集群实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表