菜鸟科技网

memcached客户端命令有哪些常用操作?

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

memcached客户端命令有哪些常用操作?-图1
(图片来源网络,侵删)

基础存储与检索命令

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 ...]
示例

memcached客户端命令有哪些常用操作?-图2
(图片来源网络,侵删)
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

memcached客户端命令有哪些常用操作?-图3
(图片来源网络,侵删)

更新与删除命令

appendprepend 命令

分别在已存在数据的末尾或开头追加新数据,要求 key 必须存在且数据为二进制安全。
语法

  • append key flags exptime bytes [noreply] data
  • prepend 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_getcmd_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  

高级命令与注意事项

incrdecr 命令

对 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_FOUNDCLIENT_ERROR

注意事项

  • key 命名规范:建议使用冒号分隔的层级命名(如 user:1001:profile),便于管理。
  • 内存管理:Memcached 采用 LRU(最近最少使用)算法淘汰数据,当内存不足时会自动删除未过期的冷数据。
  • 网络协议:所有命令和数据需以 \r\n 客户端需处理分块传输(如 VALUE 行可能分多次返回)。
  • 多线程安全:Memcached 服务端为单线程模型,客户端需自行处理并发(如通过 cas 命令避免竞争)。

相关问答FAQs

Q1:Memcached 的 setadd 命令有什么区别?
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)等信息,通过这些数据可以分析内存分配是否合理,是否存在内存碎片化问题。

分享:
扫描分享到社交APP
上一篇
下一篇