在官方网站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 分解的更多相关文章

  1. 深入浅出 Redis client/server交互流程

    综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...

  2. 【轮子狂魔】手把手教你自造Redis Client

    为什么做Redis Client? Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作. 而目前用的比较广泛的 ServiceStack.Redis 不学好,居 ...

  3. 教你写个简单到的 Redis Client 框架 - .NET Core

    目录 1,关于 Redis RESP 定义数据类型 2,定义异步消息状态机 3,定义命令发送模板 4,定义 Redis Client 5,实现简单的 RESP 解析 6,实现命令发送客户端 7,如何使 ...

  4. Redis 详解 (一) StackExchange.Redis Client

    这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...

  5. StackExchange.Redis Client

    StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...

  6. Redis client Python usage

    http://www.yiibai.com/redis/redis_sorted_sets.html mport redis r_server = redis.Redis('localhost') # ...

  7. 咏南中间件开始支持redis client接口调用

    咏南中间件开始支持redis client接口调用 咏南中间件封装了redis client接口,可以支持REDIS了. 如下图,将数据集写入REDIS缓存,和从REDIS缓存获取数据: proced ...

  8. 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 ...

  9. redis client 2.0.0 pipeline 的list的rpop bug

    描写叙述: redis client 2.0.0 pipeline 的list的rpop 存在严重bug,rpop list的时候,假设list已经为空的时候,rpop出来的Response依旧不为n ...

随机推荐

  1. Swift供选链接

    函数是运行特定任务的代码自包括块. 给定一个函数名称标识, 当运行其任务时就能够用这个标识来进行"调用". Swift的统一的功能语法足够灵活来表达不论什么东西,不管是甚至没有參数 ...

  2. leetcode第一刷_Unique Paths

    从左上到右下,仅仅能向右或向下,问一共同拥有多少种走法. 这个问题当然能够用递归和dp来做,递归的问题是非常可能会超时,dp的问题是须要额外空间. 事实上没有其它限制条件的话,这个问题有个非常easy ...

  3. hdu3294(manacher)

    传送门:Girls' research 题意:求最长回文串并输出位置及转换后的字符串. 分析:manacher算法算出最长回文串后记录中心位置,然后再转换回原字符串的起始和结束位置. #pragma ...

  4. redis优化配置和redis.conf说明

    1. redis.conf 配置參数: #是否作为守护进程执行 daemonize yes #如以后台进程执行,则需指定一个pid,默觉得/var/run/redis.pid pidfile redi ...

  5. Application to find the maximum temperature in the weather dataset

    import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop. ...

  6. 移动M站建设

    电商总结(五)移动M站建设   最近在一直在搞M站,也就是移动web站点.由于是第一次,也遇到了很多问题,所以把最近了解到的东西总结总结.聊一聊什么是移动M站,它有啥作用和优势. 也有人会问,M站和A ...

  7. hdu4389(数位dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意:f(x)表示x各位的数字和. 给定1<=L<=R<=10^9, 求[L, ...

  8. Monkey源代码分析之执行流程

    在<MonkeyRunner源代码分析之与Android设备通讯方式>中.我们谈及到MonkeyRunner控制目标android设备有多种方法.当中之中的一个就是在目标机器启动一个mon ...

  9. java性能缓慢

    虚拟帝国上面有很多营销软件是JAVA开发的!创业公司通常选择开源技术减少项目管理费用. 除了使用Java编程语言,创业公司也可以利用Java开发工具包的好处(JDK),Java运行时环境(JRE)和J ...

  10. java文字转成拼音

    package com.jframe.kit; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4 ...