进阶 docs.memcached.org 2026-10-13 18:51:48 · 23 阅读

第26章 Memcached 基础文本协议

第26章:基础文本协议

Memcached 支持少量基础命令。完整的文档请参见“协议文档”。

标准协议

Memcached 的“标准协议”操作是针对“条目(item)”执行命令的。一个条目由以下部分构成: * 键:任意字符串,长度不超过 250 字节。在 ASCII 模式下,不能包含空格或换行符。 * 32位“标志(flag)”值。 * 过期时间(秒)。值为 ‘0’ 表示永不过期。最长可设为 30 天。超过 30 天后,被视为 Unix 时间戳,指定确切日期。 * 64位“CAS”值,保持唯一性。 * 任意数据

CAS 是可选的(可以通过 -C 参数完全禁用)。内部还有其他构成条目的字段,但客户端主要与上述字段交互。

无响应模式

大多数 ASCII 命令都支持“noreply”版本。通常不建议在 ASCII 协议中使用该功能,因为这样就无法将错误与请求对应起来。其设计初衷是为了在执行写操作(如 set 或 add)后,无需等待返回数据包。

二进制协议正确实现了 noreply(静默)语句。如果你的客户端支持或使用二进制协议,你很可能会利用这一优势。

存储命令

set 最常用的命令。存储数据,可能会覆盖现有数据。新条目位于 LRU 队列顶端。

add 仅在数据不存在时存储。新条目位于 LRU 队列顶端。如果条目已存在导致 add 失败,仍会将该条目提升到 LRU 队列前端。

replace 仅在数据已存在时存储。该命令很少使用,主要为了协议完整性(涵盖 set、add、replace 等)。

append 将数据附加到现有条目的最后一个字节之后。不允许超出条目大小限制。适用于管理列表。

prepend 与 append 类似,但将新数据添加到现有数据之前。

cas 检查并设置(Check And Set,或 Compare And Swap)。这是一种仅在自上次读取后没有其他操作更新过数据的情况下才存储数据的操作。适用于解决缓存数据更新的竞态条件。

检索命令

get 用于检索数据的命令。接受一个或多个键,并返回找到的所有条目。

gets 配合 CAS 使用的替代 get 命令。返回带有 CAS 标识符(唯一的 64 位数字)的条目。在 cas 命令中返回此值。如果在执行 gets 之后条目的 CAS 值发生了变化,则数据不会被存储。

delete 如果条目存在,则从缓存中删除。

incr/decr 自增和自减。如果存储的条目是一个无符号 64 位整数的字符串表示,可以运行 incr 或 decr 命令来修改该数值。只能使用正值进行 incr 或 decr,不接受负值。如果值尚未存在,incr/decr 将失败。

统计信息

有一些命令用于返回 Memcached 服务器的计数器和设置。可以通过大量工具检查这些指标,或者简单地使用 telnet 或 netcat。协议文档中有更详细的说明。

stats 基本的统计命令。

stats items 按 slab(分块)返回存储条目的信息。

stats slabs 按 slab 返回存储条目的更多信息。重点在于 slab 的性能,而非特定条目的计数。

stats sizes 一个特殊命令,显示如果将 slab 拆分为 32 字节桶(而不是当前的 slab 数量),条目将如何分布。有助于判断 slab 大小设置的效率。 警告:这是一个开发命令。截至 1.4 版本,它仍然是唯一会导致 Memcached 实例锁定一段时间的命令。如果存储了数百万个条目,服务器可能会在几分钟内无法响应。请自行承担风险执行此命令。路线图计划将此功能设为可选,或至少提高其速度。

flush_all 使所有现有缓存条目失效。可选参数表示在 N 秒后使所有条目失效。

此命令不会暂停服务器,因为它会立即返回。它也不会释放或清空内存,只是让所有条目过期。

Meta Text 协议

评论 (0)