16.2.3.8 使用memcached TCP 文本协议

可以通过 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:客户端希望服务器拒绝addreplace命令此密钥的时间(以秒为单位)(或特定的 Unix 时间)。 在此期间,所有 addreplaceget和命令都会失败。 操作成功。这段时间过后,密钥将被永久删除并接受所有命令。 getsset

      如果未提供,则该值假定为零(立即删除)。

    • 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 该值未存储,但不是因为错误。对于您要添加或更新值(如果存在)的命令(例如addreplace),或者项目已设置为删除的命令。
EXISTS 使用cas命令时,您尝试存储的项目已经存在并且自您上次检查后已被修改。
NOT_FOUND 您尝试存储、更新或删除的项目不存在或已被删除。
ERROR 您提交了一个不存在的命令名称。
CLIENT_ERROR errorstring 输入行中有错误,详细信息包含在 中 errorstring
SERVER_ERROR errorstring 服务器中发生错误,导致无法返回信息。在极端情况下,服务器可能会在出现此错误后断开客户端。
VALUE keys flags length 已找到请求的密钥,并返回指定 的存储keyflags数据块length
DELETED 请求的密钥已从服务器中删除。
STAT name value 一行统计数据。
END 统计数据结束。