温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Redis 协议的示例分析

发布时间:2021-12-20 10:47:23 来源:亿速云 阅读:145 作者:小新 栏目:大数据

这篇文章主要介绍Redis 协议的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Redis实例运行于单独的进程,应用系统和Redis通过Redis协议进行交互。在Redis协议之上,客户端和服务器可以实现多种典型的交互模式:串行的请求/响应模式、双工的请求/响应模式(pipeline)、原子化的批量请求/响应模式(事务)、发布/订阅模式、脚本化的批量执行(脚本模式)

客户端/服务器协议

Redis的交互协议分为两部分:网络协议和序列化协议

网络交互

Redis协议位于TCP连接之上,即客户端和Redis实例保持双工的连接

客户端和服务器交互的内容是序列化后的相应类型的协议数据,服务器为每个客户端建立对应的连接,在应用层维护一系列状态保存在上图的connection中,connection间相互无关联。在Redis中,connection通过redisClient结构体实现

序列化协议

在Redis中,协议数据分为不同的类型,每种类型的数据均以CRLF(\r\n)结束,通过数据的首字符区分类型

inline command

这类数据表示Redis命令,首字符为Redis命令名的字符

simple string

首字符为'+',后续字符为strig的内容,且该string不能包含'\r'或'\n'两个字符,最后以'\r\n'结束

simple string本身不含转义,所以客户端的反序列化效率很高,直接将'+'和最后两个字节'\r\n'之间的内容拷贝即可

bulk string

对于string本身含有'\r'或'\n'的情况,解法有两种:转义和长度自描述。转义反序列化效率低下,Redis采用的是长度自描述,称为bulk string

bulk string的首字符为'$'紧随其后的是string数据的长度'\r\n'之后紧跟着string的内容本身(可以包含包括'\r'和'\n'在内的特殊字符),最后以'\r\n'结束。

"$12\r\nhello\r\nworld\r\n" 这19个字节描述了hello\r\nworld这个两行的string。

对于""空字符串和null,通过'$'之后的数字进行区分:

  • "$0\r\n\r\n" 这6个字节表示空字符串

  • "$-1\r\n" 这5个字节表示null

error

Redis中error类型的数据的内容就是一个普通的string,但是和普通的string的区别是error的首字符是'-'。客户端直接通过首字符即可判断本次交互是否出错

integer

以':'开头,紧跟着整形数字本身,最后以'\r\n'结尾。":13\r\n"表示整数13。

array

以'*'开头,紧跟着数组的长度,'\r\n'之后就是数组中每个元素序列化的数据。"*2\r\n+abc\r\n:9\r\n"表示["abc", 9]。

数组长度为0或者-1分别表示空数组或null

数组元素本身也可以是数组,多级数组是树状结构,采用类似先序遍历的方式序列化。 "*2\r\n*2\r\n:1\r\n:2\r\n*1\r\n+abc\r\n"表示[[1, 2],["abc"]]。

C/S使用的协议数据类型

客户端发送给服务的类型:inline command、由bulk string组成的array。服务端发送给客户端的类型为除了inline command之外的所有类型,并根据客户端命令或者交互模式的不同进行确定

以上是“Redis 协议的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI