zoukankan      html  css  js  c++  java
  • 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 " " (CRLF).

    译:

    RESP实际上是一种支持以下数据类型的序列化协议:短字符串。错误。整数,长字符串和数组。

    RESP作为一种请求-回应协议。在Redis中的用法例如以下:

    • client发送一种宛如RESP中长字符串数组的命令到Redis服务端。

    • Redis服务端依据命令实现回复当中一种RESP类型。

    在RESP中,一种数据类型基于第一个字节:

    • 对于短字符串,回复的第一个字节是"+"
    • 对于错误,回复的第一个字节是"-"
    • 对于整数,回复的第一个字节是":"
    • 对于长字符串,回复的第一个字节是"$"
    • 对于数组,回复的第一个字节是"*"
    另外RESP能用指定的长字符串或数组的特殊变量来表示空值。
    在RESP中,协议的不同部分总是以" "(CRLF)作为结束。

    前面说到的协议,我有强调了是client,就是说server回复client请求时用到的协议;client请求server时,仅仅须要在命令后面加上" "。

    以下是5种类型的返回实例:

    如果在redis server中存在下面键值对:
    name1	cat
    age1	10
    
    短字符串
    "set name2 fish
    "
    "+OK
    "
    
    错误
    "seet name3 dog
    "
    "-ERR unknown command 'seet'
    "
    
    整数
    "incr age1
    "
    ":11
    "
    
    长字符串
    ①
    "get name1
    "
    "$3
    cat
    "
    ②
    "get name3
    "
    "$-1
    "
    
    数组
    ①
    "mget name1 age1
    "
    "*2
    $3
    cat
    $2
    11
    "
    ②
    "mget name2 age2
    "
    "*2
    $4
    fish
    $-1
    "
    ③
    其他情况会返回"*-1
    "和"*0
    ",详细参考redis官方文件;

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    iView
    JS
    JS
    JS
    Java
    Java
    Java
    Java
    Java
    Java
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4856210.html
Copyright © 2011-2022 走看看