2024-04-15 16:10:33 21阅读
参考官方文档
Redis的网络协议,名叫RESP(REdis Serialization Protocol ) ,设计的主要目标:
RESP可以序列化多种数据结构,包括数字、字符串、数组、错误信息等。 而且保证是二进制上的安全性,可以避免网络层面的传输错误,导致数据错误的问题。
Redis采取类似命令行的方式去处理请求的。 比如GET KEY1或SET KEY VALUE. 这种方式。 而传统数据库是采取SQL的方式去处理请求, 这时单纯处理SQL解释已经是比较复杂和耗时的。 尤其是复杂或大SQL。 但Redis更简单处理, 用类似命令行的方式隔开参数。 第一个参数对应的命令,后面的参数对应这个命令的参数。 对应网络协议层, 正是字符串类型的数组。 所以Redis解释完网络报文的同时,也等于解释完请求的参数。 这也是Redis执行非常高效的原因之一。
数据类型 | 最低的支持版本 | 分类 | 第一个字节 |
Simple strings | RESP2 | Simple | + |
Simple Errors | RESP2 | Simple | - |
Integers | RESP2 | Simple | : |
Bulk strings | RESP2 | Aggregate | $ |
Arrays | RESP2 | Aggregate | * |
Nulls | RESP3 | Simple | _ |
Booleans | RESP3 | Simple | # |
Doubles | RESP3 | Simple | , |
Big numbers | RESP3 | Simple | ( |
Bulk errors | RESP3 | Aggregate | ! |
Verbatim strings | RESP3 | Aggregate | = |
Maps | RESP3 | Aggregate | % |
Sets | RESP3 | Aggregate | ~ |
Pushes | RESP3 | Aggregate | > |
+OK\r\n
-Error message\r\n
:[<+|->]<value>\r\n
$<length>\r\n<data>\r\n
$-1\r\n
$0\r\n\r\n
$5\r\nhello\r\n
*<number-of-elements>\r\n<element-1>...<element-n>
*-1\r\n
*0\r\n
*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n
_\r\n
#<t|f>\r\n
,[<+|->]<integral>[.<fractional>][<E|e>[sign]<exponent>]\r\n
,1.23\r\n
,inf\r\n
,-inf\r\n
,nan\r\n
([+|-]<number>\r\n
(3492890328409238509324850943850943825024385\r\n
!<length>\r\n<error>\r\n
!21\r\nSYNTAX invalid syntax\r\n
=<length>\r\n<encoding>:<data>\r\n
=15\r\ntxt:Some string\r\n
%<number-of-entries>\r\n<key-1><value-1>...<key-n><value-n>
{
"first": 1,
"second": 2
}
%2\r\n+first\r\n:1\r\n+second\r\n:2\r\n
~<number-of-elements>\r\n<element-1>...<element-n>
><number-of-elements>\r\n<element-1>...<element-n>
HELLO <protocol-version> [optional-arguments]
2024-04-15 16:10:33 21阅读
参考官方文档
Redis的网络协议,名叫RESP(REdis Serialization Protocol ) ,设计的主要目标:
RESP可以序列化多种数据结构,包括数字、字符串、数组、错误信息等。 而且保证是二进制上的安全性,可以避免网络层面的传输错误,导致数据错误的问题。
Redis采取类似命令行的方式去处理请求的。 比如GET KEY1或SET KEY VALUE. 这种方式。 而传统数据库是采取SQL的方式去处理请求, 这时单纯处理SQL解释已经是比较复杂和耗时的。 尤其是复杂或大SQL。 但Redis更简单处理, 用类似命令行的方式隔开参数。 第一个参数对应的命令,后面的参数对应这个命令的参数。 对应网络协议层, 正是字符串类型的数组。 所以Redis解释完网络报文的同时,也等于解释完请求的参数。 这也是Redis执行非常高效的原因之一。
数据类型 | 最低的支持版本 | 分类 | 第一个字节 |
Simple strings | RESP2 | Simple | + |
Simple Errors | RESP2 | Simple | - |
Integers | RESP2 | Simple | : |
Bulk strings | RESP2 | Aggregate | $ |
Arrays | RESP2 | Aggregate | * |
Nulls | RESP3 | Simple | _ |
Booleans | RESP3 | Simple | # |
Doubles | RESP3 | Simple | , |
Big numbers | RESP3 | Simple | ( |
Bulk errors | RESP3 | Aggregate | ! |
Verbatim strings | RESP3 | Aggregate | = |
Maps | RESP3 | Aggregate | % |
Sets | RESP3 | Aggregate | ~ |
Pushes | RESP3 | Aggregate | > |
+OK\r\n
-Error message\r\n
:[<+|->]<value>\r\n
$<length>\r\n<data>\r\n
$-1\r\n
$0\r\n\r\n
$5\r\nhello\r\n
*<number-of-elements>\r\n<element-1>...<element-n>
*-1\r\n
*0\r\n
*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n
_\r\n
#<t|f>\r\n
,[<+|->]<integral>[.<fractional>][<E|e>[sign]<exponent>]\r\n
,1.23\r\n
,inf\r\n
,-inf\r\n
,nan\r\n
([+|-]<number>\r\n
(3492890328409238509324850943850943825024385\r\n
!<length>\r\n<error>\r\n
!21\r\nSYNTAX invalid syntax\r\n
=<length>\r\n<encoding>:<data>\r\n
=15\r\ntxt:Some string\r\n
%<number-of-entries>\r\n<key-1><value-1>...<key-n><value-n>
{
"first": 1,
"second": 2
}
%2\r\n+first\r\n:1\r\n+second\r\n:2\r\n
~<number-of-elements>\r\n<element-1>...<element-n>
><number-of-elements>\r\n<element-1>...<element-n>
HELLO <protocol-version> [optional-arguments]