spec的材质:
SPCE:日本钢材(JIS标准系列)的一种钢材牌号,表示深冲用冷轧碳素钢板及钢带(卷),适合用于深冲拉伸用途。
SPCE 命名解释:第一码表示材质,S(Steel)表示钢材。第二码表示形状种类用途,P(Plate)表示板 第三码表示钢材种类,C(Cold)表示冷轧。
第四码表示冲压级别,E(Elongation)表示深冲级。冷轧碳素钢板及钢带(卷)调质代号(热处理种类):退火状态为 S , 1/8硬度为 8, 1/4 硬度为4 ,硬质(标准硬度)为1。表面结构号:麻面为 D, 光亮表面为 B。
是用于测试处理器芯片的基准的主要程序。由于不同的测试程序测试出的`处理器性能的结果值不同,所以采用一个公用的测试程序很重要。
最近,SPEC测试程序被广泛采用,大多数处理器和计算机系统制造商都提供了系统的SPEC等级。
SPEC服务器应用性能测试
SPEC服务器应用性能测试是一个全面衡量Web应用中java企业应用服务器性能的基准测试。在这个基准测试中,系统模拟一个现代化企业的电子化业务工作,如客户定购查询、产品生产制造管理、供应商和服务器提供商管理等,给系统以巨大的负载,以全面测试运行典型java业务应用的服务器性能水平。
截至到2021年,浪潮信息全新发布的M6系列服务器已打破174项SPEC世界性能测试纪录,包揽SPEC CPU Cint最具普适性,SPEC Power业界能耗评估,SPEC Java企业级Java应用,SPEC Virt等五大赛道冠军。未来无限可期。Redis客户端使用被称为 RESP(Redis序列化协议) 的协议与Redis服务器进行通讯。虽然该协议是专门为Redis设计的,但它同样可以被用于其他客户端/服务器的软件项目。
RESP 是以下几点的折中方案:
RESP 可以序列化诸如整型、字符串和数组等不同的数据类型,还有一个特定的错误类型。请求以字符串数组的形式由客户端发送到Redis服务器,字符串数组表示需要执行的命令。Redis用特定于命令的数据类型回复。
RESP 是二进制安全的,不需要处理从一个进程传输到另一个进程的批量数据,因为它使用长度前缀来传输批量数据。
注意: 这里描述的协议仅用于客户端/服务器通信,Redis集群使用不同的二进制协议在节点之间交换信息。
客户端通过创建端口号为6379的TCP来连接Redis服务器。
虽然 RESP 在技术上是非TCP特定的,但该协议仅用于Redis上下文的(或者等效的面向流的连接,如Unix套接字)TCP连接。
Redis接收由不同参数组成的命令。一旦命令被接收,将会被执行并且发送一个回复给客户端。
这可能是最简单的模型,然而,有两个例外:
除了这两种例外,Redis协议是一种简单的请求-应答协议。
Redis RESP 协议在v1.2版本中介绍,但是到v2.0才变为与服务器通信的标准。
RESP 协议支持以下数据类型: Simple Strings(简单字符串),Errors(错误),Integers(整型),Bulk Strings(批量字符串)以及Arrays(数组)。
Redis通过以下方式将 RESP 用作请求-应答协议:
在 RESP 中,第一个字节决定了数据类型:
在 RESP 中,协议不同部分总是以 \r\n (CRLF)结尾。
RESP 使用特殊的组合表示空的Bulk Strings或者空的Arrays: $-1\r\n 表示空的Bulk Strings, *-1\r\n 表示空的Arrays,需要注意的是: $0\r\n 与 *0\r\n 分别表示有回复,但长度为0。
Simple Strings(简单字符串)的编码方式为:一个 + 号在最前面,后面跟着一个不能包含CR或者LF字符的字符串(即不允许换行符),并且最后以CRLF( \r\n )结尾。
Simple Strings(简单字符串)以最小的开销传输非二进制安全的字符串。例如:很多Redis命令执行成功后的回复只是 OK , RESP 简单字符串将以5个字节编码: +OK\r\n
如果想要传输二进制安全的字符串,请使用Bulk Strings替代。
当Redis以简单字符串回复时,客户端库应该返回 + 号后面第一个字符后面的所有字符串(不包括CRLF字节)。
Redis有特定的错误类型,与Simple Strings相似,不同的是第一个字符是减号 - 而不是加号 + ,二者真正不同的是,客户端将错误视为异常,而构成Error类型的字符串就是错误消息本身。
错误类型的基本格式为:
-Error message\r\n
只有当发生错误时才会回复错误,比如你想要在错误的数据类型上执行命令,或者命令根本不存在。客户端收到Error回复时应该抛出异常。
下面是错误回复的例子:
- 号到后面第一个空格或者新行的第一个单词表示返回的错误类型,这只是Redis使用的约定,而不是 RESP 错误格式的一部分。
比如, ERR 是一般错误,但是 WRONGTYPE 是一个更具体的错误,暗示客户端尝试执行应对错误类型的操作。这被称为 错误前缀 ,是一种允许客户端了解服务器返回的错误类型而无需检查确切错误消息的方法。
客户端实现可能会针对不同的错误返回不同类型的异常,或者通过直接将错误名称作为字符串提供给调用者来提供捕获错误的通用方法。
但是不应将此类功能视为至关重要,因为它很少有用,并且有限的客户端实现可能会简单地返回通用错误条件,例如false
这种类型只是一个以CRLF结尾的字符串,表示一个整数,前缀为 : ,比如: :0\r\n 和 :1000\r\n 。
有很多返回整型的Redis命令,比如: INCR 、 LLEN 以及 LASTSAVE 。返回的整型数据范围为有符号的64位整数。
整型回复同样可以用来表示true或者false,比如 EXISTS 或者 SISMEMBER 将会返回1表示true,0表示false。
其他命令比如 SADD 、 SREM 、 SETNX 如果被执行了将会返回1,否则返回0。
其他返回整型的命令: SETNX 、 DEL 、 EXISTS 、 INCR 、 INCRBY 、 DECR 、 DECRBY 、 DBSIZE 、 LASTSAVE 、 RENAMENX 、 MOVE 、 LLEN 、 SADD 、 SREM 、 SISMEMBER 、 SCARD 。
Bulk Strings被用来表示单个的最大长度512MB的二进制安全字符串。
Bulk Strings编码方式为:
所以,字符串 hello 被编码为: $5\r\nhello\r\n
一个空字符串被编码为: $0\r\n\r\n
RESP Bulk Strings也可用特殊格式表示不存在(NULL),在这种格式中,长度为-1,没有数据: $-1\r\n ,这被称作 NULL Bulk String ,当服务器回复NULL Bulk String时,客户端库的API不应该返回空的字符串,而是返回nil对象。
客户端使用RESP Arrays发送命令到服务器。同样,某些返回元素集合给客户端的命令使用RESP数组作为回复,比如: LRANGE 命令。RESP Arrays以下面的格式发送:
所以,空数组编码为: *0\r\n
包含"hello"和"world"两个元素的RESP数组被编码为: *2\r\n$5\r\nhello\r\n$5\r\nworld\r\n
如你所见, *<count>CRLF 前缀后面,组成数组的其他数据类型只是一个接一个的连接起来,比如一个由3个整型构成的Array编码结果为: *3\r\n:1\r\n:2\r\n:3\r\n
Array可以包含不同的数据类型,比如一个有4个整型和一个批量字符串组成的Array编码为:(为了直观,以换行的形式展现)
第一行 *5\r\n 为了表示后面还有5个回复,然后再读取后面的5个数组元素。
值为NULL的数组也存在(通常使用NULL Bulk String,由于历史原因,NULL存在两种格式)。比如 BLPOP 超时时将会返回一个长度为-1的NULL Array: *-1\r\n
在RESP中同样存在嵌套的数组,比如两个嵌套的数组编码结果为:
上面的编码结果包含两个元素的数组,第一个元素由(1,2,3)构成的子数组,第二个元素由一个Bulk String(+Hello)和一个Error(-World)组成的数组。
一个Array的单个元素可能为NULL。这在Redis回复中用来表示这些元素丢失而不是空字符串。当 SORT 命令使用 GET pattern 子命令并且key缺失时,将会发生这种情况。一个包含NULL元素的数组回复为:
上面的编码解析结果为:["hello", nil, "world"]
可以根据上面几部分的介绍来编写Redis客户端,同时进一步了解客户端和服务器之间的交互是如何工作的。
所以,一种典型的交互场景可能如下:
为了获取存储在 mylist 中的列表的长度,客户端发送命令 LLEN mylist 到服务器,然后服务器回复客户端一个整型回复:
protocol-spec
Redis系列第一篇之SPEC协议
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)