国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 02:38:23
字體:
來源:轉載
供稿:網友

【輪子狂魔】手把手教你自造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", ""));    
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             get11             {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         #endregion28 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

哦,不好意思,補上有圖有真相


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金溪县| 横峰县| 兴安县| 象州县| 华宁县| 廊坊市| 永德县| 永州市| 碌曲县| 鄂托克前旗| 鹤峰县| 台南市| 昌图县| 阿拉尔市| 荣昌县| 花垣县| 嘉定区| 延安市| 磴口县| 台南县| 县级市| 周至县| 远安县| 积石山| 内黄县| 聂拉木县| 长宁区| 夏河县| 怀柔区| 宣武区| 武邑县| 阿尔山市| 寿宁县| 禹州市| 柘荣县| 大竹县| 乐平市| 远安县| 桑植县| 威信县| 岚皋县|