这篇文章主要介绍Redis 协议的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Redis实例运行于单独的进程,应用系统和Redis通过Redis协议进行交互。在Redis协议之上,客户端和服务器可以实现多种典型的交互模式:串行的请求/响应模式、双工的请求/响应模式(pipeline)、原子化的批量请求/响应模式(事务)、发布/订阅模式、脚本化的批量执行(脚本模式)。
Redis的交互协议分为两部分:网络协议和序列化协议。
Redis协议位于TCP连接之上,即客户端和Redis实例保持双工的连接。
客户端和服务器交互的内容是序列化后的相应类型的协议数据,服务器为每个客户端建立对应的连接,在应用层维护一系列状态保存在上图的connection中,connection间相互无关联。在Redis中,connection通过redisClient结构体实现。
在Redis中,协议数据分为不同的类型,每种类型的数据均以CRLF(\r\n)结束,通过数据的首字符区分类型。
这类数据表示Redis命令,首字符为Redis命令名的字符。
首字符为'+',后续字符为strig的内容,且该string不能包含'\r'或'\n'两个字符,最后以'\r\n'结束。
simple string本身不含转义,所以客户端的反序列化效率很高,直接将'+'和最后两个字节'\r\n'之间的内容拷贝即可。
对于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
Redis中error类型的数据的内容就是一个普通的string,但是和普通的string的区别是error的首字符是'-'。客户端直接通过首字符即可判断本次交互是否出错。
以':'开头,紧跟着整形数字本身,最后以'\r\n'结尾。":13\r\n"表示整数13。
以'*'开头,紧跟着数组的长度,'\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"]]。
客户端发送给服务的类型:inline command、由bulk string组成的array。服务端发送给客户端的类型为除了inline command之外的所有类型,并根据客户端命令或者交互模式的不同进行确定。
以上是“Redis 协议的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。