Redis协议详解

由于前段时间在使用ServiceStack.Redis感觉不怎么方便和其代码实现也不理想所以就产生编写一个Redis .Net Client的想法(毕竟自己动手丰衣足食啊).实现的目的就是可以更简单了操作Redis并提供更多的数据处理方式如:String,json和Protobuf等。在操作Redis其实是通过TCP等方式来处理,所以它和其他网络服务一样有一个交互协议;Redis的交互协议比较怪异,第一次看感觉制定这协议很不合理……不过理解下来协议总体来说还是比较简单。

Redis的通讯协议可以说大集汇了……消息头标识,消息行还有就行里可能还有个数据块大小描述.首先Redis是以行来划分,每行以\r\n行结束。每一行都有一个消息头,消息头共分为5种分别如下:

(+) 表示一个正确的状态信息,具体信息是当前行+后面的字符。

(-)  表示一个错误信息,具体信息是当前行-后面的字符。

(*) 表示消息体总共有多少行,不包括当前行,*后面是具体的行数。

($) 表示下一行数据长度,不包括换行符长度\r\n,$后面则是对应的长度的数据。

(:) 表示返回一个数值,:后面是相应的数字节符。

以上就是Redis协议的基础组成部分,下面来分析几个指令了解一下具体相关指令和返回情况.

SET

C:

1
SET HENRY  HENRYFAN

以上命令是设置HENRY 的值为HENRYFAN.在Redis的通讯协议上会以空格把命令拆分成三行;得到最终的命令如下:

1
2
3
4
5
6
7
*3\r\n
$3\r\n
SET\r\n
$5\r\n
HENRY\r\n
$8\r\n
HENRYFAN\r\n

S:

服务端操作成功

1
+OK\r\n

如果出现错误服务端会返回

1
-错误信息\r\n

GET

C:

1
GET HENRY

产生的通讯指令是:

1
2
3
4
5
*2\r\n
$3\r\n
GET\r\n
$5\r\n
HENRY\r\n

S:

如果存在这个Key则返回

1
2
$8\r\n
HENRYFAN\r\n

不存在返回

1
$-1\r\n

HKEYS

C:

1
HKEYS HENRY

以上命令是获取对应HENRY有多少个field成员

1
2
3
4
5
*2\r\n
$5\r\n
HKEYS\r\n
$5\r\n
HENRY\r\n

S:

如果不存在任何字段信息

1
*0\r\n

如果存在QQ字段信息

1
2
3
*1\r\n
$2\r\n
QQ\r\n

HMGET

C:

1
HMGET HENRY QQ

以上命令是获取HENRY的QQ信息。

1
2
3
4
5
6
7
*3\r\n
$5\r\n
HMGET\r\n
$5\r\n
HENRY\r\n
$2\r\n
QQ\r\n

S:

如果不存在字段值

1
2
*1\r\n
$-1\r\n

存在字段值

1
2
3
*1\r\n
$8\r\n
28304340\r\n

以上主要列举Redis普遍处理的一些情况,由于指令太多就不一一列举了,如果有需要自己实现Client的朋友可以到Redis官方看相关命令文档。

分享一下新完成的功能

设置用户的UserBase和Contact字段信息

1
2
3
4
5
6
7
8
9
10
11
12
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字段信息

1
2
3
4
5
6
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);
            }

Redis协议详解的更多相关文章

  1. Redis学习——详解Redis配置文件(三)

    一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...

  2. HTTP协议详解(转)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  3. HTTP协议详解

    Author :Jeffrey 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...

  4. redis配置详解

    ##redis配置详解 # Redis configuration file example. # # Note that in order to read the configuration fil ...

  5. 动态选路、RIP协议&&OSPF协议详解

    动态选路.RIP协议&&OSPF协议详解 概念 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路.路由器之间必须采用选路协议进行通信,这样的选路协议 ...

  6. ASP.NET知识总结(3.HTTP协议详解)

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  7. 接口测试之HTTP协议详解

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  8. 计算机网络(12)-----HTTP协议详解

    HTTP协议详解 http请求 http请求由三部分组成,分别是:请求行.消息报头.请求正文 (1)请求行 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Metho ...

  9. OSPF协议详解

    CCNP OSPF协议详解 2010-02-24 20:30:22 标签:CCNP 职场 OSPF 休闲 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是 ...

随机推荐

  1. 选择29部分有用jQuery应用程序插件(免费点数下载)

    免积分下载:http://download.csdn.net/detail/yangwei19680827/7238711 原文地址:http://www.cnblogs.com/sxwgf/p/36 ...

  2. java基金会 之 HashMap统计csvWord文档

    一:知识的补充( 这个HashMap Map 和 c++的Map还是有非常大的区别,惊人的差异大的人,当然,两者的作用是相同的,但函数名出一个非常大的.即使iterator的差是非常大的 ) (1)H ...

  3. MySQL检查连接的最大数量和改变的最大连接数

    版权声明:本文博主原创文章.博客,未经同意不得转载.

  4. CentOS修改用户密码方法

    CentOS修改用户密码方法 CentOS修改用户密码方法 1. 普通用户 a. 获取超级用户root权限 命令:su或者su -或者su - root b. passwd 用户名 2. 超级用户 a ...

  5. 我的MYSQL学习心得(十一)

    原文:我的MYSQL学习心得(十一) 我的MYSQL学习心得(十一) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYS ...

  6. JS对text非空判断,非空校验

    function JTrim(s){    return s.replace(/(^\s*)|(\s*$)/g, "");} //你先调用一下这个方法,然后在判断 function ...

  7. js 正则之 判断密码类型

    原文:js 正则之 判断密码类型 今天没啥写的,就分享个思路吧.之前在群里讨论的时候,谢亮兄弟说判断密码是否是纯数字,纯字母之类的.如果用 , 条判断,那就老长一大段了.这个思路是我之前看 jQuer ...

  8. Fluent NHibernate

    Fluent NHibernate]第一个程序 目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Flu ...

  9. Callback

    由于 JavaScript 语句(指令)是逐一执行的 - 按照次序,动画之后的语句可能会产生错误或页面冲突,因为动画还没有完成. 为了避免这个情况,您可以以参数的形式添加 Callback 函数. j ...

  10. mysql查询字段值为数字

    原文:mysql查询字段值为数字 我想查询字段值为数字的sql如下:select * from tj_item_result where tj_value REGEXP '^[0-9]'