可以通过 TCP 或 UDP 协议 与memcached服务器通信。使用 TCP 协议时,您可以使用简单的基于文本的界面来交换信息。
与memcached通信时,您可以使用为服务器配置的端口连接到服务器。您无需授权或登录即可打开与服务器的连接。连接后,您就可以开始向服务器发送命令。完成后,您可以终止连接而无需发送任何特定的断开连接命令。鼓励客户端保持连接打开以减少延迟并提高性能。
memcached
数据以两种形式
发送到服务器:
文本行,用于向服务器发送命令,并接收来自服务器的响应。
非结构化数据,用于接收或发送给定键的值信息。数据以提供的格式返回给客户端。
文本行(命令和响应)和非结构化数据始终以字符串结尾\r\n
。因为存储的数据可能包含这个序列,所以应该根据数据的长度(非结构化数据传输前客户端返回的)来判断数据的结束。
发送到服务器的命令根据其操作进行结构化:
存储命令:
set
,add
,replace
,append
,prepend
,cas
服务器的存储命令采用以下形式:
command key [flags] [exptime] length [noreply]
或者在使用比较和交换 (cas) 时:
cas key [flags] [exptime] length [casunique] [noreply]
在哪里:
command
: 命令名称。set
:根据键存储值add
:如果密钥不存在,则将此值存储在密钥中replace
:如果密钥已经存在,则将此值存储在密钥中append
:将提供的值附加到指定键的值的末尾。不应使用 和flags
参数 。exptime
prepend
:将当前在缓存中的值附加到指定键提供的值的末尾。不应使用 和flags
参数 。exptime
cas
:仅当提供的casunique
匹配时,将指定的键设置为提供的值。如果自从我上次获取信息以来没有人更新过信息,这实际上相当于更改信息。
key
: 钥匙。所有数据都使用特定的密钥存储。密钥不能包含控制字符或空格,并且最多可以包含 250 个字符。flags
:操作的标志(作为整数)。memcached中的标志 是透明的。Memcached服务器忽略标志的内容。客户端可以使用它们来指示任何类型的信息。在 memcached 1.2.0 及更低版本中,该值是一个 16 位整数值。在 memcached 1.2.1 及更高版本中,该值是一个 32 位整数。exptime
: 到期时间,或零表示没有到期。length
:提供的值块的长度(以字节为单位),不包括终止\r\n
字符。casunique
:现有条目的唯一 64 位值。这用于与现有值进行比较。发布更新gets
时使用命令 返回的值 。cas
noreply
:告诉服务器不要回复命令。
例如,要将值存储
abcdef
到键xyzkey
中,您可以使用:set xyzkey 0 0 6\r\nabcdef\r\n
服务器的返回值是一行,指定状态或错误信息。有关详细信息,请参阅 表 16.3 “memcached 协议响应”。
检索命令:
get
,gets
检索命令采用以下形式:
get key1 [key2 .... keyn] gets key1 [key2 ... keyn]
您可以为命令提供多个键,每个请求的键由空格分隔。
服务器以以下形式的信息行响应:
VALUE key flags bytes [casunique]
在哪里:
key
: 键名。flags
:存储值时提供给内存缓存服务器的标志整数的值。bytes
:存储值的大小(不包括终止\r\n
字符序列)。casunique
:标识项目的唯一 64 位整数。
信息行紧跟在值数据块之后。例如:
get xyzkey\r\n VALUE xyzkey 0 6\r\n abcdef\r\n
如果您请求了多个密钥,则会为找到的每个密钥返回一个信息行和数据块。如果缓存中不存在请求的键,则不返回任何信息。
删除命令:
delete
删除命令采用以下形式:
delete key [time] [noreply]
在哪里:
key
: 键名。time
:客户端希望服务器拒绝add
或replace
命令此密钥的时间(以秒为单位)(或特定的 Unix 时间)。 在此期间,所有add
、replace
、get
和命令都会失败。 操作成功。这段时间过后,密钥将被永久删除并接受所有命令。gets
set
如果未提供,则该值假定为零(立即删除)。
noreply
:告诉服务器不要回复命令。
对该命令的响应要么
DELETED
表明密钥已成功删除,要么NOT_FOUND
表明找不到指定的密钥。递增/递减:
incr
,decr
递增和递减命令更改服务器内键的值,而无需执行单独的获取/设置序列。这些操作假定当前存储的值是一个 64 位整数。如果存储的值不是 64 位整数,则在应用递增或递减操作之前假定该值为零。
递增和递减命令采用以下形式:
incr key value [noreply] decr key value [noreply]
在哪里:
key
: 键名。value
: 用作递增或递减值的整数。noreply
:告诉服务器不要回复命令。
响应是:
NOT_FOUND
: 找不到指定的密钥。value
: 与指定键关联的新值。
假定值是无符号的。对于
decr
操作,该值永远不会递减到 0 以下。对于incr
操作,该值环绕 64 位最大值。统计命令:
stats
该命令提供有关memcached实例
stats
的当前状态及其存储的数据的详细统计信息 。统计命令采用以下形式:
STAT [name] [value]
在哪里:
name
:要返回的统计信息的可选名称。如果未指定,则返回一般统计信息。value
:执行某些统计操作时要使用的特定值。
返回值是一个统计数据列表,格式如下:
STAT name value
统计数据以一行结束,
END
。有关详细信息,请参阅 第 16.2.4 节,“获取memcached统计信息”。
作为参考,下面提供了支持的不同命令及其格式的列表。
表 16.2 memcached 命令参考
命令 | 命令格式 |
---|---|
set |
set key flags exptime length ,set key flags
exptime length noreply |
add |
add key flags exptime length ,add key flags
exptime length noreply |
replace |
replace key flags exptime length ,replace
key flags exptime length noreply |
append |
append key length ,append key length
noreply |
prepend |
prepend key length ,prepend key length
noreply |
cas |
cas key flags exptime length casunique ,cas
key flags exptime length casunique noreply |
get |
get key1 [key2 ... keyn] |
gets |
|
delete |
delete key , delete key noreply ,
delete key expiry ,delete key
expiry noreply |
incr |
incr key , incr key noreply ,
incr key value ,incr key value
noreply |
decr |
decr key , decr key noreply ,
decr key value ,decr key value
noreply |
stat |
stat , stat name ,stat
name value |
当向服务器发送命令时,服务器的响应是下表中的设置之一。来自服务器的所有响应值都以以下方式终止
\r\n
:
表 16.3 memcached 协议响应
细绳 | 描述 |
---|---|
STORED |
值已成功存储。 |
NOT_STORED |
该值未存储,但不是因为错误。对于您要添加或更新值(如果存在)的命令(例如add 和
replace ),或者项目已设置为删除的命令。 |
EXISTS |
使用cas 命令时,您尝试存储的项目已经存在并且自您上次检查后已被修改。 |
NOT_FOUND |
您尝试存储、更新或删除的项目不存在或已被删除。 |
ERROR |
您提交了一个不存在的命令名称。 |
CLIENT_ERROR errorstring |
输入行中有错误,详细信息包含在 中
errorstring 。 |
SERVER_ERROR errorstring |
服务器中发生错误,导致无法返回信息。在极端情况下,服务器可能会在出现此错误后断开客户端。 |
VALUE keys flags length |
已找到请求的密钥,并返回指定 的存储key 和
flags 数据块length 。 |
DELETED |
请求的密钥已从服务器中删除。 |
STAT name value |
一行统计数据。 |
END |
统计数据结束。 |