Memcached 是一种高性能的分布式内存对象缓存系统,主要用于动态 Web 应用以减轻数据库负载,通过客户端命令,用户可以与 Memcached 服务器进行交互,实现数据的存储、检索、更新和删除等操作,这些命令通常通过 Telnet、NC 或专门的客户端库(如 Python 的 pymemcache、Java 的 SpyMemcached)发送,命令格式为 command <key> <flags> <exptime> <bytes> [data block],部分命令可能省略某些参数,以下详细介绍常用的 Memcached 客户端命令及其使用场景。

基础存储与检索命令
set 命令
用于将数据存入 Memcached,若 key 已存在则覆盖其值。
语法:set key flags exptime bytes [noreply] data
key:唯一标识符,长度不超过 250 字节。flags:32 位无符号整数,客户端可用于存储额外信息(如数据类型标记)。exptime:过期时间(秒),0 表示永不过期;若超过 30 天(2592000 秒),Memcached 会将其视为 Unix 时间戳。bytes:数据块长度(不包括\r\n),需与实际数据长度一致。noreply:可选参数,若指定,服务器不返回响应。data:实际存储的数据,需以\r\n
示例:
set user:1001 0 360 10 username=Alice\r\n STORED
上述命令将 username=Alice 存入 Memcached,过期时间为 360 秒,key 为 user:1001。
get 命令
用于检索一个或多个 key 对应的值,若 key 不存在或已过期则忽略。
语法:get key [key ...]
示例:

get user:1001 VALUE user:1001 0 10 username=Alice END
VALUE行表示 key 存在,依次输出 key、flags、数据长度和数据内容。END标识响应结束。
add 呯令
仅当 key 不存在时存储数据,若 key 已存在则返回 NOT_STORED。
语法:add key flags exptime bytes [noreply] data
示例:
add user:1002 0 360 5 status=ok\r\n STORED
若再次执行相同 add 命令,服务器会返回 NOT_STORED。
replace 命令
仅当 key 存在时替换其值,若 key 不存在则返回 NOT_STORED。
语法:replace key flags exptime bytes [noreply] data
示例:
replace user:1001 0 360 6 status=ok\r\n STORED
前提是 user:1001 已存在,否则返回 NOT_STORED。

更新与删除命令
append 和 prepend 命令
分别在已存在数据的末尾或开头追加新数据,要求 key 必须存在且数据为二进制安全。
语法:
append key flags exptime bytes [noreply] dataprepend key flags exptime bytes [noreply] data
示例:set user:1001 0 0 5 hello\r\n STORED append user:1001 0 0 6 world\r\n STORED get user:1001 VALUE user:1001 0 11 hello world END
prepend则会在数据开头追加,结果为worldhello。
cas 命令(Check And Set)
用于实现乐观锁,仅在 key 的 cas_id 匹配时更新数据,避免并发修改冲突。
语法:cas key flags exptime bytes unique_cas_id [noreply] data
unique_cas_id:由gets命令返回的唯一标识符,每次修改后会更新。
示例:gets user:1001 VALUE user:1001 0 5 1 hello END cas user:1001 0 0 5 2 world\r\n ERROR
若
cas_id不匹配(如 1≠2),返回ERROR;若匹配则更新并返回STORED。
delete 命令
删除指定 key,若 key 不存在则返回 NOT_FOUND。
语法:delete key [noreply]
示例:
delete user:1001 DELETED
若再次删除,返回 NOT_FOUND。
统计与管理命令
stats 命令
返回服务器的运行状态信息,包括内存使用、连接数、命中率等。
语法:stats [args]
常用参数:
stats:返回所有统计信息。stats slabs:显示内存 slab 分配器详情(如各 slab 类的使用情况)。stats items:显示当前存储的 item 数量按 key 前缀分类。stats reset:重置统计计数器(如cmd_get、cmd_set)。
示例输出:
stats STAT pid 12345 STAT uptime 3600 STAT curr_items 100 STAT total_items 500 STAT bytes_read 1024000 STAT bytes_written 2048000 END
flush_all 命令
清空所有缓存数据,可设置延迟执行(秒)。
语法:flush_all [delay] [noreply]
delay:延迟清空时间,0 表示立即执行。
示例:flush_all all SERVER_ERROR flush_all with all parameter is not supported flush_all 10 OK
10 秒后所有数据将被清空。
version 命令
返回 Memcached 服务器的版本信息。
语法:version
示例:
version VERSION 1.6.9
高级命令与注意事项
incr 和 decr 命令
对 key 对应的数值进行原子性递增或递减,要求 key 存在且值为 64 位无符号整数。
语法:
incr key delta [noreply]decr key delta [noreply]
示例:set counter 0 0 1 5\r\n STORED incr counter 1 6 decr counter 2 4
若 key 不存在或非数值类型,返回
NOT_FOUND或CLIENT_ERROR。
注意事项
- key 命名规范:建议使用冒号分隔的层级命名(如
user:1001:profile),便于管理。 - 内存管理:Memcached 采用 LRU(最近最少使用)算法淘汰数据,当内存不足时会自动删除未过期的冷数据。
- 网络协议:所有命令和数据需以
\r\n客户端需处理分块传输(如VALUE行可能分多次返回)。 - 多线程安全:Memcached 服务端为单线程模型,客户端需自行处理并发(如通过
cas命令避免竞争)。
相关问答FAQs
Q1:Memcached 的 set 和 add 命令有什么区别?
A:set 命令会无条件存储数据,若 key 已存在则覆盖其值;而 add 命令仅在 key 不存在时存储数据,若 key 已存在则返回 NOT_STORED,不会覆盖原有数据。add 适用于需要确保 key 唯一性的场景,如用户注册时检查用户名是否已存在。
Q2:如何通过 stats 命令查看 Memcached 的内存使用情况?
A:使用 stats slabs 命令可以查看内存 slab 分配器的详细信息,包括每个 slab 类的 ID、大小、已分配 item 数量、内存占用等。stats slabs 会返回类似 STAT 1:chunk_size 96(slab 1 中每个 chunk 大小为 96 字节)、STAT 1:used_chunks 10(已使用 10 个 chunk)等信息,通过这些数据可以分析内存分配是否合理,是否存在内存碎片化问题。
