由於前段時間在使用ServiceStack.Redis感覺不怎麼方便和其程式碼實現也不理想所以就產生編寫一個Redis .Net Client的想法(畢竟自己動手豐衣足食啊).實現的目的就是可以更簡單了操作Redis並提供更多的資料處理方式如:String,json和Protobuf等。在操作Redis其實是通過TCP等方式來處理,所以它和其他網路服務一樣有一個互動協議;Redis的互動協議比較怪異,第一次看感覺制定這協議很不合理……不過理解下來協議總體來說還是比較簡單。
Redis的通訊協議可以說大集匯了……訊息頭標識,訊息行還有就行裡可能還有個資料塊大小描述.首先Redis是以行來劃分,每行以\r\n行結束。每一行都有一個訊息頭,訊息頭共分為5種分別如下:
(+) 表示一個正確的狀態資訊,具體資訊是當前行+後面的字元。
(-) 表示一個錯誤資訊,具體資訊是當前行-後面的字元。
(*) 表示訊息體總共有多少行,不包括當前行,*後面是具體的行數。
($) 表示下一行資料長度,不包括換行符長度\r\n,$後面則是對應的長度的資料。
(:) 表示返回一個數值,:後面是相應的數字節符。
以上就是Redis協議的基礎組成部分,下面來分析幾個指令瞭解一下具體相關指令和返回情況.
SET
C:
SET HENRY HENRYFAN
以上命令是設定HENRY 的值為HENRYFAN.在Redis的通訊協議上會以空格把命令拆分成三行;得到最終的命令如下:
*3\r\n $3\r\n SET\r\n $5\r\n HENRY\r\n $8\r\n HENRYFAN\r\n
S:
服務端操作成功
+OK\r\n
如果出現錯誤服務端會返回
-錯誤資訊\r\n
GET
C:
GET HENRY
產生的通訊指令是:
*2\r\n $3\r\n GET\r\n $5\r\n HENRY\r\n
S:
如果存在這個Key則返回
$8\r\n HENRYFAN\r\n
不存在返回
$-1\r\n
HKEYS
C:
HKEYS HENRY
以上命令是獲取對應HENRY有多少個field成員
*2\r\n $5\r\n HKEYS\r\n $5\r\n HENRY\r\n
S:
如果不存在任何欄位資訊
*0\r\n
如果存在QQ欄位資訊
*1\r\n $2\r\n QQ\r\n
HMGET
C:
HMGET HENRY QQ
以上命令是獲取HENRY的QQ資訊。
*3\r\n $5\r\n HMGET\r\n $5\r\n HENRY\r\n $2\r\n QQ\r\n
S:
如果不存在欄位值
*1\r\n $-1\r\n
存在欄位值
*1\r\n $8\r\n 28304340\r\n
以上主要列舉Redis普遍處理的一些情況,由於指令太多就不一一列舉了,如果有需要自己實現Client的朋友可以到Redis官方看相關命令文件。
分享一下新完成的功能
設定使用者的UserBase和Contact欄位資訊
UserBase user = new UserBase(); user.Name = "henryfan"; user.City = "guangzhou"; user.Counrty = "cn"; user.Age = 18; Contact contact = new Contact(); contact.EMail = "henryfan@msn.com"; contact.Phone = "111111"; contact.QQ = "28304340"; ProtobufRecord pr = new ProtobufRecord("henryfan_pb"); pr.Set<UserBase>(user).Set<Contact>(contact); pr.Save(db);
獲取指定使用者的UserBase和Contact欄位資訊
ProtobufRecord pr = new ProtobufRecord("henryfan_pb"); pr.Load<UserBase, Contact>(db); foreach (Field item in pr.Fields) { Console.WriteLine("{0}:{1}", item.Name, item.Value); }