Redis協議詳解


由於前段時間在使用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);
            }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM