redis client protocol 分解
在官方网站http://redis.io/topics/protocol我们必须redis通信协议做说明。
根据以下某些原因。我想解决redis client protocol:
1、足够了解通信协议。有助于做出更好的系统设计。
2、学习RESP的设计思想,不仅能扩展我的思维,或许将来能应用于我的代码中。
3、由于有些人想将redis client直接并入自己已有的系统中;包含我在内。这个将在我以后的文章再做说明。
以下我翻译一下http://redis.io/topics/protocol一些我觉得重要的内容:
Redis clients communicate with the Redis server using a protocol called RESP (REdis Serialization Protocol). While the protocol was designed specifically for Redis, it can be used for other client-server software projects.
RESP is a compromise between the following things:
- Simple to implement.
- Fast to parse.
- Human readable.
RESP can serialize different data types like integers, strings, arrays. There is also a specific type for errors. Requests are sent from the client to the Redis server as arrays of strings representing the arguments of the command to execute. Redis replies
with a command-specific data type.
RESP is binary-safe and does not require processing of bulk data transferred from one process to another, because it uses prefixed-length to transfer bulk data.
Note: the protocol outlined here is only used for client-server communication. Redis Cluster uses a different binary protocol in order to exchange messages between nodes.
译:
redisclient和redis服务端用一种名叫RESP(REdis Serialization Protocol)的协议通信。尽管这样的协议专门为redis设计,可是它能被用于其他基于C/S模型的软件项目中。
RESP是基于以下一些事实的一种折衷方案:
- 易于实现
- 高速解释
- 人类可读
RESP能序列化不同的数据类型。比如整型,字符串,数组,还有专门的错误类型。
client发送字符串数组请求到服务端。而字符串数组表示命令參数去运行。Redis会用专门的命令类型回复。
RESP是二进制安全的,同一时候过程转换中不须要大量的数据处理,由于它使用了前缀长度去转换批量数据。
注意:在这里概述的协议仅仅用于client-服务端通信。而Redis集群为了不同节点交换消息使用了一种不同的二进制协议。
RESP is actually a serialization protocol that supports the following data types: Simple Strings, Errors, Integers, Bulk Strings and Arrays.
The way RESP is used in Redis as a request-response protocol is the following:
- Clients send commands to a Redis server as a RESP Array of Bulk Strings.
- The server replies with one of the RESP types according to the command implementation.
In RESP, the type of some data depends on the first byte:
- For Simple Strings the first byte of the reply is "+"
- For Errors the first byte of the reply is "-"
- For Integers the first byte of the reply is ":"
- For Bulk Strings the first byte of the reply is "$"
- For Arrays the first byte of the reply is "
*"
Additionally RESP is able to represent a Null value using a special variation of Bulk Strings or Array as specified later.
In RESP different parts of the protocol are always terminated with "\r\n" (CRLF).
译:
RESP实际上是一种支持以下数据类型的序列化协议:短字符串。错误。整数,长字符串和数组。
RESP作为一种请求-回应协议。在Redis中的用法例如以下:
- client发送一种宛如RESP中长字符串数组的命令到Redis服务端。
- Redis服务端依据命令实现回复当中一种RESP类型。
在RESP中,一种数据类型基于第一个字节:
- 对于短字符串,回复的第一个字节是"+"
- 对于错误,回复的第一个字节是"-"
- 对于整数,回复的第一个字节是":"
- 对于长字符串,回复的第一个字节是"$"
- 对于数组,回复的第一个字节是"*"
另外RESP能用指定的长字符串或数组的特殊变量来表示空值。
在RESP中,协议的不同部分总是以"\r\n"(CRLF)作为结束。
前面说到的协议,我有强调了是client,就是说server回复client请求时用到的协议;client请求server时,仅仅须要在命令后面加上"\r\n"。
以下是5种类型的返回实例:
如果在redis server中存在下面键值对:
name1 cat
age1 10 短字符串
"set name2 fish\r\n"
"+OK\r\n" 错误
"seet name3 dog\r\n"
"-ERR unknown command 'seet'\r\n" 整数
"incr age1\r\n"
":11\r\n" 长字符串
①
"get name1\r\n"
"$3\r\ncat\r\n"
②
"get name3\r\n"
"$-1\r\n" 数组
①
"mget name1 age1\r\n"
"*2\r\n$3\r\ncat\r\n$2\r\n11\r\n"
②
"mget name2 age2\r\n"
"*2\r\n$4\r\nfish\r\n$-1\r\n"
③
其他情况会返回"*-1\r\n"和"*0\r\n",详细参考redis官方文件;
版权声明:本文博主原创文章,博客,未经同意不得转载。
redis client protocol 分解的更多相关文章
- 深入浅出 Redis client/server交互流程
综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...
- 【轮子狂魔】手把手教你自造Redis Client
为什么做Redis Client? Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作. 而目前用的比较广泛的 ServiceStack.Redis 不学好,居 ...
- 教你写个简单到的 Redis Client 框架 - .NET Core
目录 1,关于 Redis RESP 定义数据类型 2,定义异步消息状态机 3,定义命令发送模板 4,定义 Redis Client 5,实现简单的 RESP 解析 6,实现命令发送客户端 7,如何使 ...
- Redis 详解 (一) StackExchange.Redis Client
这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...
- StackExchange.Redis Client
StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...
- Redis client Python usage
http://www.yiibai.com/redis/redis_sorted_sets.html mport redis r_server = redis.Redis('localhost') # ...
- 咏南中间件开始支持redis client接口调用
咏南中间件开始支持redis client接口调用 咏南中间件封装了redis client接口,可以支持REDIS了. 如下图,将数据集写入REDIS缓存,和从REDIS缓存获取数据: proced ...
- redis集群错误解决:/usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb:79:in `call': ERR Slot 15495 is already busy (Redis::CommandError)
错误信息: /usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb:79:in `call': ERR Slot 15495 is al ...
- redis client 2.0.0 pipeline 的list的rpop bug
描写叙述: redis client 2.0.0 pipeline 的list的rpop 存在严重bug,rpop list的时候,假设list已经为空的时候,rpop出来的Response依旧不为n ...
随机推荐
- KFC - About KFC - Quality Assurance
KFC - About KFC - Quality Assurance Restaurant Quality The main attributes for KFC restaurant excell ...
- HDU 1231:最大连续子序列(DP)
pid=1231">最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- VSTO之旅系列(一):VSTO入门
原文:VSTO之旅系列(一):VSTO入门 引言: 因为工作的原因,这段时间一直在看VSTO的相关的内容的,因此希望通过这个系列来记录下我学习的过程和大家分享Office开发的相关知识,希望以后有朋友 ...
- Struts2中指定的校验文件不起作用的原因
转载请注意出处:http://blog.csdn.net/bettarwang/article/details/39801733 我们知道,假设要为某个Action指定校验文件.那么就要将" ...
- 【STL】关联容器 — hash_set
容器hash_set是以hash table为底层机制的,差点儿所有的操作都是转调用hash table提供的接口.因为插入无法存储同样的键值,所以hash_set的插入操作所有都使用hash tab ...
- Wix学习整理(3)——关于Windows Installer和MSI
原文:Wix学习整理(3)--关于Windows Installer和MSI 关于Windows Installer Windows Installer是微软Windows操作系统自带的一个软件安装和 ...
- hdu1025(nlon(n)最长上升子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 大致思路:设置两个a,b数组,a数组存储数据,b数组存储最长不降序序列.此算法关键在于设计二分查 ...
- hdu 1561 The more, The Better (依赖背包 树形dp)
题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = ...
- SE 2014年4月29日
交换网络中有vlan1 到20个vlan,要求使用MSTP技术实现vlan的负载分担. SW2为实例1(vlan1-vlan10)的主根,SW3为备根 SW3为实例2(vlan11-vlan20)的主 ...
- VBoxGuestAdditions.iso下载地址
http://download.virtualbox.org/virtualbox/4.1.2/VBoxGuestAdditions_4.1.2.iso 其它版本号可依次判断..