memcache通信协议(转载)ITeye - 牛牛娱乐

memcache通信协议(转载)ITeye

2019-01-13 13:11:04 | 作者: 恨桃 | 标签: 协议,指令,效劳 | 浏览: 3025

英文水平很烂,做梦都想着能把英语学习,能够运用一口流利的英文和洋鬼子沟通,趁便忽悠下自己的同胞。没有当地学习英语,看还能够,网上有许多关于计算机 的英文文献,写还行,说就彻底不或许了。在今后的工作中渐渐的训练自己的英语水平吧,先翻译一下一些计算机的英文文献,训练下^_^,能读则读不能读则一 笑置之。


协议
关键字 Keys
指令Commands
超时时间 Expiration times
过错信息 Error strings
存储指令 Storage commands
读取指令 Retrieval command
删去 Deletion
添加/削减 Increment/Decrement
计算 Statistics
多用途计算 General-purpose statistics
其他指令 Other commands
UDP协议 UDP protocol


协议
       memcached的客户端通过TCP衔接与效劳器通讯(UDP协议的接口也能够运用,具体阐明请参阅”UDP 协议”部分)。一个给定的运转中的memcached效劳器在某个(可装备的)端口上监听衔接;客户端衔接该端口,发送指令给效劳器,读取反应,最终封闭 衔接。


       没有必要发送一个专门的指令去完毕会话。客户端能够在不需求该衔接的时分就封闭它。留意:咱们鼓舞客户端缓存它们与效劳器的衔接,而不是每非有必要存储或读 取数据的时分再次从头树立与效劳器的衔接。memcache一同翻开许多衔接不会对功能形成到大的影响,这是因为memcache在规划之处,就被规划成 即便翻开了许多衔接(数百或许需求时上千个衔接)也能够高效的运转。缓存衔接能够节约与效劳器树立TCP衔接的时间开支(于此比较,在效劳器段为树立一个 新的衔接所做预备的开支能够疏忽不计)。


       memcache通讯协议有两种类型的数据:文本行和非结构化数据。文本行用来发送从客户端到效劳器的指令以及从效劳器回送的反应信息。非结构化的数据 用在客户端期望存储或许读取数据时。效劳器会以字符流的方式严厉精确的回来相应数据在存储时存储的数据。效劳器不重视字节序,它也不知道字节序的存在。 memcahce对非结构化数据中的字符没有任何约束,能够是恣意的字符,读取数据时,客户端能够在前次回来的文本行中切当的知道接下来的数据块的长度。


       文本行一般以“"r"n”完毕。非结构化数据一般也是以“"r"n”完毕,虽然"r、"n或许其他任何8位字符能够出现在数据块中。所以当客户端从效劳 器读取数据时,有必要运用前面供给的数据块的长度,来断定数据流的完毕,二不是依据跟随在字符流尾部的“"r"n”来断定数据流的完毕,虽然实际上数据流格 式如此。


关键字 Keys
memcached运用关键字来区别存储不同的数据。关键字是一个字符串,能够仅有标识一条数据。当时关键字的长度约束是250个字符(当然现在客户端好像没有需求用这么长的关键字);关键字必定不能包括控制字符和空格。


指令Commands
memcahe有3种类型的指令:


l         存储指令—(3个指令:set、add和replace)要求效劳器装置关键字存储数据。客户端发送一个指令行,然后一个数据块;指令履行后客户端等候一行反应,用来标明指令履行成功与否。


l         读取指令-- (只要1个指令:get)要求效劳器依据一组关键字读取数据(在一个恳求总能够包括一个或多个关键字)。客户端发送一个包括恳求关键字的指令行;指令传递 到效劳器后,效劳器就查找每一个关键字下的数据,然户将数据以“一个关键字数据,一个反应信息行跟着一个数据块”的格局回送数据,直到效劳器发送 “END”的反应行。


l         其他指令,如flush_all,version等。这些指令不运用非结构化的数据。关于这些指令,客户端发送一个文本的指令行,依据指令的特性等候一行数据或许在最终一行以“END“完毕的几行反应信息。


一切的指令行总是以指令的姓名开端,紧接着是以空格切割的参数。指令称号都是小写,而且是大小写灵敏的。


超时时间 Expiration times
       一些发送到效劳器的指令包括超时时间(该超时时间对应于:数据项保存时间;客户端操作限时)。在这些比如中,被发送的实在时间要么是UNIX时间戳(自 1970年零时起的秒数数值),或许从当时时间开端算起的秒数。关于后一种状况,秒数的数值不能超越60*60*24*30(30天的秒数);如 果秒数的数值大于了这个数值,效劳器会以为该数值是UNIX时间戳,而不是自当时时间开端的秒数偏移值。


过错信息 Error strings
       每个指令都有或许被反应以一个过错音讯。这些过错音讯有以下三个类型:


l         “ERROR"r"n” 


意味着客户端发送了一个在协议中不存在的指令。


l         "CLIENT_ERROR error "r"n"


标明客户端输入的指令行上存在某种过错,输入不符合协议规则。 error 是一个人工可读(human-readable)的过错注释。


l         "SERVER_ERROR error "r"n"


标明效劳器在履行指令时发作了某些过错,致使效劳器无法履行下去。 error 也是一个人工可读(human-readable)的过错注 释。在一些状况下,过错导致效劳器不能再为客户端效劳(这样的状况很少发作),效劳器就会在发作过错音讯后自动封闭衔接。这也是效劳器自动封闭到客户端连 接的仅有状况。


       后续秒数各种指令的时分,咱们不再赘述过错音讯的状况,当咱们要清楚过错是存在的,不行疏忽。


存储指令 Storage commands
       首要,客户端发作如下这样的指令:


command name key flags exptime bytes "r"n


data block "r"n


其间:


command name 是 set、add或许replace。set标明存储该数据;add标明假如效劳器没有保存该关键字的状况下,存储该数据;replace标明在效劳器现已具有该关键字的状况下,替换原有内容。


key 是客户端要求效劳器存储数据的关键字。


flags 是一个16位的无符号整数,效劳器将它和数据一同存储而且当该数据被检索时一同回来。客户端或许运用该数值作为一个位图来存储特别数据信息;这个字段对效劳器不是通明的。


exptime 是超时时间。假如值为0标明该数据项永久不超时(但有时分该数据项或许被删去以为其他数据腾出空间);假如值不为0,或许是肯定的UNIX时间,也或许是自现在开端的偏移值,它确保客户段在这个超时时间抵达后,客户端将取不到该数据项。


bytes 是随后数据的字节数,不包括终结符”"r"n”。 bytes 有或许是0,它后边将是一个空的数据块。


data block 是实在要存储数据流。


       发送指令行和数据后,客户端等候反应,能够是如下几种状况:


l         "STORED"r"n"              标明存储数据成功。


l         "NOT_STORED"r"n"    标明发送的数据没有存储,但这不因为过错,而是发作在add或许replace指令不能满意条件时,或许数据项正处于要删去的行列中。


l         过错音讯


读取指令 Retrieval command:
       读取指令如下所示:


get key *"r"n


key *标明一个或多个运用空格切割的关键字字符串。


       发送指令后,客户端等候回来一个或多个数据项,每个数据项的格局是一个文本行,后跟着一个数据块。当一切的数据项发送完毕后,效劳器发送字符串”END"r"n”标明效劳器反应数据的完毕。


       回来数据项的格局如下:


VALUE key flags bytes "r"n


data block "r"n


key 是发作数据项的关键字。


        flags 是存储该数据项时,客户端指令中的标志字段。


        bytes 是紧跟文本行后数据块的长度,不包括终结符”"r"n”。


data block 是数据项的数据部分。


       假如恳求指令行中的有些关键字对应的数据项没有被回来,这意味着效劳器没有该关键字标明下的数据项(有或许是从来没有被存储过,或许存储过但被删去掉以腾出内存空间,或许数据项超时了,再或许它被某个客户端删去了)。


删去 Deletion
删去指令答应直接删去数据项,指令格局如下:


delete key time "r"n


key 是客户端期望效劳器删去数据项的关键字


time 是客户端期望效劳器阻挠add和replace指令运用该关键字数据项的秒数,能够是相对时间也能够是UNIX的肯定时间。在这 段时间内,数据项被放入一个删去行列,它不能被get指令读取,在其上运用add和replace也会失利,但运用set指令能够成功。当这个时间曩昔 后,数据项从效劳器的内存中实在的删去。该参数是可选参数,假如不存在默以为0,这意味着当即从效劳器上删去。


       效劳器回来信息:


l         "DELETED"r"n"          标明数据项删去成功


l         "NOT_FOUND"r"n"      标明该关键字指定的数据项在效劳器上没有找到


l         其他过错音讯


下面的flush_all指令使得一切存在的数据项当即失效。


添加/削减 Increment/Decrement
       “incr”和”decr”指令用来修正以及存在的数据项的内容,添加或许削减它。该数据被当作32位无符号整数处理。假如当时数据非此类数据,则经将 该内容当作0来处理。别的在其上施加incr/decr指令的数据项有必要是业已存在的;关于不存在的数据项不会将它作为0对待,而是以过错完毕。


       客户端发送指令行如下格局:


incr key value "r"n


或许


decr key value "r"n


key 是客户端要修正数据项的关键字


value 是对该数据行进行添加或许削减的操作数。它是一个32位的无符号整数。


       反应信息有如下几种:


l         "NOT_FOUND"r"n"


标明在效劳器上没有找到该数据项。


l         " value "r"n "


value是履行完添加/削减指令后,该数据项新的数值。


l         过错信息。


留意到“decr”指令的下溢问题,假如客户端测验削减的数量小于0,其成果是0。“incr”指令的溢出问题没有查看。别的削减一个数据而使它削减了长度,但不确保削减它回来时的长度。该数字或许是附加空格的数字,但这仅仅完结的优化,所以你不能信任它。


计算 Statistics
       “stats”指令用来查询效劳器的运转状况和其他内部数据。它有两种状况,以有无参数来区别:


stats"r"n


或许


stats args "r"n


       第一种状况它导致效劳器输出一般计算信息以及设置信息和文档化内容。


       第二种状况依据 args 具体的参数,效劳器发送各种内部数据。这部分没有在协议中文档化,因为与memcache的开发者有关其或许是随时改变的。


多用途计算 General-purpose statistics
       当接收到没有带参数的“stats”指令后,效劳器发送许多相似与如下格局的文本行:


STAT name value "r"n


       当相似的文本行悉数发送完毕后,效劳器发送如下的文本行完毕反应信息:


END"r"n


       在一切STAT文本行中, name 是该计算项意图称号, value 是其数据。下面是一份stats指令反应的一切计算 项意图列表,后边跟着其值的数据类型。在数据类型列中,”32u”标明一个32位无符号整数,”64u”标明一个64位无符号整数,”32u:32u”表 示是两个用冒号切割的32位无符号整数。


称号


值类型


意义


pid


32u


效劳器进程的进程号


uptime


32u


效劳器自运转以来的秒数


time


32u


当时效劳器上的UNIX时间


version


string


效劳器的版别字符串


rusage_user


32u:32u


效劳器进程堆集的用户时间(秒:奇妙)


rusage_system


32u:32u


效劳器进程堆集的体系时间(秒:奇妙)


curr_items


32u


当时在效劳器上存储的数据项的个数


total_items


32u


在效劳器上从前保存过的数据项的个数


bytes


64u


当时效劳器上保存数据的字节数


curr_connections


32u


处于翻开状况的衔接数目


total_connections


32u


从前翻开过的一切衔接的数目


connection_structures


32u


效劳器分配的衔接结构体的个数


cmd_get


64u


get指令恳求的次数


cmd_set


64u


存储指令恳求的次数


get_hits


64u


关键字获取射中的次数


get_misses


64u


关键字获取没有射中的次数


evictions


64u


一切因超时而被替换出内存的数据项的个数


bytes_read


64u


效劳器从网络上读取到的字节数


bytes_write


64u


效劳器向网络上写的字节数


limit_maxbytes


64u


效劳器答应存储数据的最大值


其他指令 Other commands
"flush_all"是一个带有可选数字参数的指令,它的履行总是成功的,效劳器总是响应以"OK"r"n"字符串。它的效果是使得一切的数据项当即 (默许)或许通过一个指定的超时时间后悉数失效。在置数据项失效后,关于读取指令将不会回来任何内容,除非在失效后这些数据再次被存储。 flush_all并没有实在的开释这些存在过的数据项占用的内存空间;数据空间实在被占用的状况发作在运用新的数据项掩盖老的数据项时。该指令效果最准 确的界说是:它导致一切更新时间早于该指令设定的时间点的数据项,在被检索时被疏忽,其体现就像已被删去了相同。


       运用带有延时flush_all指令的意图是,当你有个memcached效劳器池,需求改写一切的内容时,但不能在同一时间冲洗一切的效劳器,这样就 或许因为一切的效劳器俄然都要从头树立数据内容,而导致数据库压力的波动。延时选项答应你设置他们隔10秒失效(设置第一个延时为0,第二个10秒,第三 个20秒等等)。


"version"是一个没有参数的指令,指令格局如下:


version"r"n


       效劳器发回的反应信息如下:


l         "VERSION version "r"n"


version 是从效劳器回来的版别字符串。


l         过错音讯。


"verbosity"是一个带有数字参数的指令。它的履行总是成功的,效劳器反应以"OK"r"n"标明履行完结。它用来设置日志输出的具体等级。                                        


"quit"是一个没有参数的指令。其格局如下:


quit"r"n


       当效劳器承受到此指令后,就封闭与该客户的衔接。不管怎样,客户端能够在恣意不需求该衔接的时间封闭它,而不需求发送该指令。


UDP协议 UDP protocol
       当根据TCP协议的衔接数超越TCP衔接的上限时,咱们能够运用UDP协议来代替。可是UDP协议接口不供给牢靠的传输,所以多用在不严厉要求成功的操作上;典型的get恳求会因为缓存的问题,引起丢掉或许不完好的传输。


       每个UDP数据包包括一个简略的帧头,接着就是如TCP协议描绘的数据格局的数据流。在当时的完结中,恳求有必要包括在一个独自的UDP数据包中,但回来 或许涣散在多个数据包中。(仅有的能够拆分恳求数据包的是大的多关键字get恳求和set恳求,鉴于牢靠性比较而言他们更适合用TCP传输。)


       帧头有8字节长,如下是其格局(一切的数字都是16位网络字节序整形,高位在前):


       0 - 1                     恳求ID


       2 - 3                     序列号


       4 - 5                     在当时的音讯中含有的数据包的个数


       6-7                保存今后运用,当时有必要为0


       恳求ID由客户端供给。它的典型值是一个从随机种子开端递增值,实际上客户端能够运用恣意的恳求ID。效劳器的反应信息中包括了和恳求指令中相同的恳求 ID。客户端凭仗这个恳求ID区别来自于同一效劳器的反应。每一个包括不知道恳求ID的数据包,或许是因为延时反应形成,这些数据包都应该扔掉不必。


       序列号从0到n-1,n是音讯中总的数据包的个数。客户端依照序列号排序重组数据包;成果序列中包括了一个完好的如TCP协议相同格局的反应信息(包括了“"r"n”总结字符串)。

 

原文地址:http://blog.csdn.net/educast/article/details/19751909

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    UTLITeye

    数据,目录,文件
  • 3
  • 4
  • 5

    java与函数式编程ITeye

    函数,编程,一些
  • 6
  • 7
  • 8
  • 9
  • 10