最近想系统学习下Nosql和mysql,今天看到了redis的协议内容 转载出来 :
http://www.redis.cn/topics/protocol.html
协议说明
Redis协议在以下几点之间做出了折衷:
- 简单的实现
- 快速地被计算机解析
- 简单得可以能被人工解析
网络层
Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。在客户端与服务器端之间传输的每个Redis命令或者数据都以\r\n
结尾。
请求
Redis接收由不同参数组成的命令。一旦收到命令,将会立刻被处理,并回复给客户端。
新的统一请求协议
新的统一协议已在Redis 1.2中引入,但是在Redis 2.0中,这就成为了与Redis服务器通讯的标准方式。
在这个统一协议里,发送给Redis服务端的所有参数都是二进制安全的。以下是通用形式:
*<number of arguments> CR LF
$<number of bytes of argument 1> CR LF
<argument data> CR LF
...
$<number of bytes of argument N> CR LF
<argument data> CR LF
例子如下:
*3
$3
SET
$5
mykey
$7
myvalue
上面的命令看上去像是单引号字符串,所以可以在查询中看到每个字节的准确值:
"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"
在Redis的回复中也使用这样的格式。批量回复时,这种格式用于每个参数$6\r\nmydata\r\n
。 实际的统一请求协议是Redis用于返回列表项,并调用 Multi-bulk回复。 仅仅是N个以以*<argc>\r\n
为前缀的不同批量回复,<argc>
是紧随的参数(批量回复)数目。
回复
Redis用不同的回复类型回复命令。它可能从服务器发送的第一个字节开始校验回复类型:
- 用单行回复,回复的第一个字节将是“+”
- 错误消息,回复的第一个字节将是“-”
- 整型数字,回复的第一个字节将是“:”
- 批量回复,回复的第一个字节将是“$”
- 多个批量回复,回复的第一个字节将是“
*
”
状态回复
状态回复(或者单行回复)以“+”开始以“\r\n”结尾的单行字符串形式。例如:
+OK
客户端库将在“+”后面返回所有数据,正如上例中字符串“OK”一样。
错误回复
错误回复发送类似于状态回复。唯一的不同是第一个字节用“-”代替“+”。
错误回复仅仅在一些意料之外的事情发生时发送,例如:如果你试图执行一个操作来应付错误的数据类型,或者如果命令不存在等等。所以当收到一个错误回复时,客户端将会出现一个异常。
整型回复
这种回复类型只是用CRLF结尾字符串来表示整型,用一个字节的“:”作为前缀。例如:“:0\r\n”,或者“:1000\r\n”是整型回复。
像INCR或者LASTAVE命令用整型回复作为实际回复值,此时对于返回的整型没有特殊的意思。它仅仅是为INCR、LASTSAVE的UNIX时间等增加数值。
一些命令像EXISTS将为true返回1,为false返回0。
其它命令像SADD、SREM和SETNX如果操作实际完成了的话将返回1,否则返回0。
接下来的命令将回复一个整型回复:SETNX、DEL、EXISTS、INCR、INCRBY、DECR、DECRBY、DBSIZE、LASTSAVE、RENAMENX、MOVE、LLEN、SADD、SREM、SISMEMBER、SCARD。
批量回复(Bulk replies)
批量回复被服务器用于返回一个单二进制安全字符串。
C: GET mykey
S: $6\r\nfoobar\r\n
服务器发送第一行回复,该行以“$”开始后面跟随实际要发送的字节数,随后是CRLF,然后发送实际数据,随后是2个字节的额外数据用于最后的CRLF。服务器发送的准确序列如下:
"$6\r\nfoobar\r\n"
如果请求的值不存在,批量回复将使用特殊的值-1来作为数据长度,例如:
C: GET nonexistingkey
S: $-1
当请求的对象不存在时,客户端库API不会返回空字符串,而会返回空对象。例如:Ruby库返回‘nil’,而C库返回NULL(或者在回复的对象里设置指定的标志)等等。
多批量回复(Multi-bulk replies)
像命令LRNGE需要返回多个值(列表的每个元素是一个值,而LRANGE需要返回多于一个单元素)。使用多批量写是有技巧的,用一个初始行作为前缀来指示多少个批量写紧随其后。批量回复的第一个字节总是*
,例如:
C: LRANGE mylist 0 3
s: *4
s: $3
s: foo
s: $3
s: bar
s: $5
s: Hello
s: $5
s: World
正如您可以看到的多批量回复是以完全相同的格式使用Redis统一协议将命令发送给服务器。
服务器发送的第一行是*4\r\n
,用于指定紧随着4个批量回复。然后传送每个批量写。
如果指定的键不存在,则该键被认为是持有一个空的列表,且数值0被当作多批量计数值来发送,例如:
C: LRANGE nokey 0 1
S: *0
当BLPOP命令超时时,它返回nil多批量回复。这种类型多批量回复的计数器是-1
,且值被当作nil来解释。例如:
C: BLPOP key 1
S: *-1
当这种情况发生时,客户端库API将返回空nil对象,且不是一个空列表。这必须有别于空列表和错误条件(例如:BLPOP命令的超时条件)。
多批量回复中的Nil元素
多批量回复的单元素长度可能是-1,为了发出信号这个元素被丢失且不是空字符串。这种情况发送在SORT命令时,此时使用GET模式选项且指定的键丢失。一个多批量回复包含一个空元素的例子如下:
S: *3
S: $3
S: foo
S: $-1
S: $3
S: bar
第二个元素是空。客户端库返回如下:
["foo",nil,"bar"]
多命令和管道
客户端能使用同样条件为了发出多个命令。管道用于支持多命令能够被客户端用单写操作来发送,它不需要为了发送下一条命令而读取服务器的回复。所有回复都能在最后被读出。
通常Redis服务器和客户端拥有非常快速的连接,所以在客户端的实现中支持这个特性不是那么重要,如果一个应用需要在短时间内发出大量的命令,管道仍然会非常快。
旧协议发送命令
在统一请求协议出现前,Redis用不同的协议发送命令,现在仍然支持,它简单通过手动telnet。在这种协议中,有两种类型的命令:
- 内联命令:简单命令其参数用空格分割字符串。非二进制安全。
- 批量命令:批量命令准确如内联命令,但是最后的参数用特殊方式来处理用于保证最后参数二进制安全。
内联命令
最简单的发送Redis命令的方式是通过内联命令。下面是一个使用内联命令聊天的服务器/客户端的例子(服务器聊天用S:开始,客户端聊天用C:开始)。
C: PING
S: +PONG
下面是另外一个内联命令返回整数的例子:
C: EXISTS somekey
S: :0
因为‘somekey’不存在,所以服务器返回‘:0’。
注意:EXISTS命令带有一个参数。参数用空格分割。
批量命令
一些命令当用内联命令发送时需要一种特殊的格式用于支持最后参数二进制安全。这种命令用最后参数作为“字节计数器”,然后发送批量数据(因为服务器知道读取多少个字节,所以是二进制安全的)。
请看下面的例子:
C: SET mykey 6
C: foobar
S: +OK
这条命令的最后一个参数是‘6’。这用于指定随后数据的字节数,即字符串“foobar”。注意:虽然这个字节流是以额外的两个CRLF字节结尾的。
所有批量命令都是用这种准确的格式:用随后数据的字节数代替最后一个参数,紧跟着后面是组成参数本身的字节和CRLF。为了更清楚程序,下面是通过客户端发送字符串的例子:
"SET mykey 6\r\nfoobar\r\n"
Redis有一个内部列表,用于表示哪些命令是内联,哪些命令是批量,所以你不得不发送相应的命令。强烈建议使用新的统一请求协议来代替老的协议。
相关推荐
redis是在Erlang中实现redis协议的应用程序和库。 用法 rebar3 shell 序列化器 使用redis:encode/1函数以Redis数据格式编码Erlang术语: % integer redis : encode ( 1 ). % simple string redis : encode (<&...
本文将详细介绍如何利用易语言实现对Redis协议的操作,特别是针对JimStone(谢栋)编写的Redis协议客户端模块——STRedisClient。这个模块为易语言开发者提供了一种与Redis服务器通信的便捷方式,使易语言程序能够...
1. `00-RELEASENOTES`通常包含软件发布时的更新日志和版本信息,可以帮助我们了解Redis 5.0.14.1相较于之前版本的改进和修复。 2. `redis.windows-service.conf`和`redis.windows.conf`是Redis在Windows环境下的...
带注释的重显示 Redis python客户端:redis-py原始注解 关于 本项目是Redis Python客户端redis-py_2.8.0二进制注释版,原始代码: : redis-py代码本身非常精简(主要...了解redis请求协议对理解代码有很大帮助(读者
从数据包捕获中解码 redis 协议,以更好地了解谁在使用您的 redis 服务器以及他们正在用它做什么。 安装: npm -g install redis_trace 例子 $ sudo ./redis_trace -f "port 6379" -i lo0 Listening on lo0 03:12...
9. **网络协议**: Redis基于简单高效的RESP(REdis Serialization Protocol)协议,易于实现客户端。 10. **模块系统**: 自Redis 4.0起,引入了模块系统,允许扩展其功能,如Geo索引、图数据库等。 在Redis-x64-...
1. 链表(List):Redis使用了简单的双向链表来实现列表数据类型。每个链表节点包含一个指向前一个节点和后一个节点的指针,以及节点的值。这种结构允许快速地在链表两端插入和删除元素。 2. 跳跃表(Skip List):...
1. **安装Redis**:在所有节点上安装Redis服务,如Centos7.4系统上通过源码编译安装。 2. **配置主从复制**:在Master节点上配置redis.conf,设置允许复制,然后在Slave节点上配置redis.conf,指定复制Master。 3. *...
作为开源软件,它遵循BSD许可协议,这意味着任何人都可以自由地使用、修改和分发Redis的源代码。Redis在设计上以内存存储为主,但同时也支持数据持久化,确保了在系统崩溃或重启后能够恢复数据。 Redis的特点包括但...
1. ACL权限控制:Redis引入了ACL(Access Control Lists)来提供更细粒度的权限管理,允许管理员定义不同用户的角色和操作权限。多线程部分仅负责网络数据的读写和协议解析,而命令执行仍保持单线程,确保命令执行的...
1. **数据结构**:Redis支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这些数据结构使得Redis在各种场景下都有很好的表现。 2. **持久化**:Redis...
1. **内存存储**:Redis所有的数据都存储在内存中,这使得其读写速度极快,但同时也要注意内存的大小限制。 2. **持久化**:为了防止数据丢失,Redis提供了两种持久化机制:RDB(Redis Database Backup)和AOF...
Redis 使用二进制协议,性能优异,且提供了丰富的客户端库,适用于多种编程语言。 2. **版本 3.0.504**: Redis 3.0.504 是 Redis 的一个稳定版本,发布于 2015 年。该版本包含了一些重要的优化和改进,比如对发布...
1. **高性能**:Redis基于内存操作,数据读写速度快,适合大量数据的快速访问。同时,Redis也支持持久化,将内存中的数据定期或在特定事件下保存到磁盘,确保数据安全。 2. **丰富的数据结构**:除了基础的字符串...
4. **客户端连接**:可以使用`redis-cli.exe`命令行工具连接本地Redis服务器,或者使用其他支持Redis协议的客户端进行连接。 博客文章“http://blog.csdn.net/gaohuanjie/article/details/44627247”可能提供了更...
6. **网络通信**: Redis使用TCP协议,客户端可以使用各种语言的Redis客户端库与服务器通信。由于Redis是单线程模型,所以它的性能瓶颈通常在于CPU而非网络IO。 7. **复制**: Redis支持主从复制,一个主节点可以有多...
5. 协议支持:Redis使用简单明了的RESP(REdis Serialization Protocol)协议,易于与其他语言的客户端库集成。 二、Redis 7.2.4新特性: 1. 性能优化:每个新版本都会针对特定场景进行性能优化,7.2.4也不例外,...
本项目是基于C#的NewLife.Redis高性能Redis协议封装设计源码,包含119个文件,其中包括95个C#源文件、6个csproj文件、3个YAML文件、2个PNG图片文件、2个pubxml文件、1个Editorconfig文件、1个gitignore文件、1个eddx...
1. **内存存储**:Redis的所有数据都存储在内存中,这使得它在读写速度上有着显著优势,尤其适合处理大量小数据项的场景。 2. **数据结构丰富**:Redis支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。...
本压缩包“易语言源码Redis协议客户端易语言模块源码.rar”包含了使用易语言实现的Redis协议客户端的相关源代码。Redis是一款开源、高性能的键值存储系统,常用于数据库、缓存和消息中间件等场景。通过这个源码,...