【轮子狂魔】手把手教你自造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指令类似,我就不贴出来了
var tcpClient = new System.Net.Sockets.TcpClient();
tcpClient.Connect("127.0.0.1", );
string setCommand = "set test csharp\r\n";
tcpClient.Client.Send(Encoding.UTF8.GetBytes(setCommand));
System.Diagnostics.Trace.Write(setCommand);
byte[] buffer = new byte[];
tcpClient.Client.Receive(buffer);
System.Diagnostics.Trace.Write(Encoding.UTF8.GetString(buffer).Replace("\0", ""));
| 想象中的调用方式 |
1.第一行有个关键思维是单例模式,即我希望全局只有一个Redis Client。(多个的话可以直接用RedisClient)
2.RedisClient的连接地址可自由指定
3. 从单例中取出Client就可以简单粗暴的上ta。client.Set(key,value)
var client = RedisSingleton.GetInstance.Client = new Client.RedisClient("127.0.0.1", );
client.Set("test", "Framework.Redis");
var value = client.Get("test");
Trace.Write("client get:" + value);
| 重构一个RedisManager和RedisClient |
RedisManager 其实就是个简单的单例模式,封装了一个全局唯一的对象而已。如果不想全局唯一,直接用RedisClient就可以了。
public class RedisSingleton
{
#region 单例 private static RedisSingleton _redisSingleton = null;
private static object _locker = new object(); public static RedisSingleton GetInstance
{
get
{
if (_redisSingleton == null)
{
lock (_locker)
{
if (_redisSingleton == null)
{
_redisSingleton = new RedisSingleton();
}
}
} return _redisSingleton;
}
} #endregion public RedisClient Client { get; set; }
}
RedisClient 是真正的与Redis交互的代码(因为这只是个简单粗暴的Demo,所以代码不太美观,见谅!之后会继续完善我的这个自造的Redis)
public class RedisClient
{
private TcpClient _tcpClient = null; public RedisClient(string serverIP, int serverPort)
{
_tcpClient = new TcpClient();
_tcpClient.Connect(serverIP, serverPort);
} public void Set(string key, string value)
{
string setCommand = "set " + key + " " + value + "\r\n";
_tcpClient.Client.Send(Encoding.UTF8.GetBytes(setCommand));
Logger.Info(setCommand);
var result = GetRaw();
if (result != "+OK")
{
throw new Exception("redis error:" + result);
}
} public string Get(string key)
{
string setCommand = "get " + key + "\r\n";
_tcpClient.Client.Send(Encoding.UTF8.GetBytes(setCommand));
Logger.Info(setCommand);
string value = GetRaw();
Logger.Info("get " + key + " value:" + value);
return value.Split(new string[] { "\r\n" }, StringSplitOptions.None)[];
} private string GetRaw()
{
byte[] buffer = new byte[];
_tcpClient.Client.Receive(buffer);
string value = Encoding.UTF8.GetString(buffer).Replace("\0", "").TrimEnd("\r\n".ToCharArray());
return value;
}
}
| 最后是大家喜欢的广告环节 |
全部代码就这么多我就不分享我的oschina上的项目地址了,因为目前正在做一个开源的mvc项目需要使用Redis,所以自己造了这么个轮子。
如果你有兴趣加入我们,请加群:7424099
哦,不好意思,补上有图有真相

【轮子狂魔】手把手教你自造Redis Client的更多相关文章
- 手把手教你SpringBoot2整合Redis
此文仅为初学java的同学学习,大佬请勿喷,文末我会附上完整代码包供大家参考 redis的搭建教程此处略过,大家自行百度,本文的教程开始: 一.先在pom.xml中添加相关依赖 <!--redi ...
- 手把手教你用redis实现一个简单的mq消息队列(java)
众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...
- 手把手教你使用Rollup打包📦并发布自己的工具库🔧
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...
- 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...
- 手把手教你学Dapr - 5. 状态管理
上一篇:手把手教你学Dapr - 4. 服务调用 介绍 使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中. 您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来 ...
- 手把手教你学Dapr - 6. 发布订阅
上一篇:手把手教你学Dapr - 5. 状态管理 介绍 发布/订阅模式允许微服务使用消息相互通信.生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息.这涉及将它们写入输入通道.同样,消 ...
- 手把手教你学Dapr - 7. Actors
上一篇:手把手教你学Dapr - 6. 发布订阅 介绍 Actor模式将Actor描述为最低级别的"计算单元".换句话说,您在一个独立的单元(称为actor)中编写代码,该单元接收 ...
- 手把手教你学Dapr - 8. 绑定
目录 手把手教你学Dapr - 1. .Net开发者的大时代 手把手教你学Dapr - 2. 必须知道的概念 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 手把手教你学Dapr ...
- [原创]手把手教你写网络爬虫(7):URL去重
手把手教你写网络爬虫(7) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 本期我们来聊聊URL去重那些事儿.以前我们曾使用Python的字典来保存抓取过的URL,目的是将重复抓取的UR ...
随机推荐
- opengl redbook Fatal Error in XXXXXX pixel format with necessary capabilities not found
随便运行书中的一个程序aaindex.c时出现了下面的错误:pixel format with necessary capabilities not found 解决方法: http://www.ed ...
- 团队开发中,eclipse中安装jre
团队合作中配置jre时,jre名称应该保持一致,否则不要提交.classpath文件 window-preferences 团队合作中,JRE name一定要一致!
- 一、CSS概述 二、CSS的选择器(认识) 三、CSS样式和属性(练习) 四、重构商城首页DIV+CSS(页面布局)(重点) 浮动/更改显示方式
一.CSS概述###<1>概念 DIV,就是一个HTML元素,块级元素,通常结合CSS进行页面的布局. CSS,层叠样式表,给HTML元素增强显示. ###<2>作用 样式定义 ...
- 自制年月选择插件 jquery.MyDatePicker v1.0beta
参数: el: null, //默认值和位置从哪个文本框取,传入jquery对象 ,默认为this 用于按钮引发文本框的focus事件来弹出 viewtype: 'month', //日期控件模式 默 ...
- ZT Android 4.2蓝牙介绍
Android 4.2蓝牙介绍 分类: Android开发系列 2013-06-27 14:16 7110人阅读 评论(22) 收藏 举报 目录(?)[-] Android 42蓝牙介绍 一 蓝牙规 ...
- 手写阻塞队列(Condition实现)
自己实现阻塞队列的话可以采用Object下的wait和notify方法,也可以使用Lock锁提供的Condition来实现,本文就是自己手撸的一个简单的阻塞队列,部分借鉴了JDK的源码.Ps:最近看面 ...
- DA-GAN技术【简介】【机器通过文字描述创造图像】
[题外话:今天上课我做了一个关于DA-GAN技术的ppt演讲,写一点东西留念一下...] 转载请注明出处:https://www.cnblogs.com/GraceSkyer/p/9107471.ht ...
- Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;能够将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/24256091 Session操作过程中的po ...
- net::ERR_CONNECTION_RESET 报错原因
1> 向tomcat 服务器上上传视频, 谷歌浏览器控制台报出: 打开信地址栏后 发现: net::ERR_CONNECTION_RESET 错误, 但是此视频以经过mp4转码(注: 浏览器支 ...
- 【转】Spring Boot干货系列:(六)静态资源和拦截器处理
前言 本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter. 正文 前面章节我们也有简单介绍过SpringBoot中对静态资源的默认支持 ...