Memcached协议详解:从基础命令到元命令操作指南
memcached memcached development tree 项目地址: https://gitcode.com/gh_mirrors/mem/memcached
协议概述
Memcached采用基于TCP的文本协议进行客户端与服务器通信(也支持UDP协议)。客户端通过建立TCP连接到Memcached服务器的指定端口,发送命令并读取响应,完成操作后可随时关闭连接。
连接管理最佳实践:建议客户端缓存连接而非频繁创建新连接。Memcached专为处理大量并发连接(数百甚至上千)而优化,连接复用可避免TCP三次握手带来的性能损耗。
数据传输格式
协议中传输两种类型数据:
- 文本行:用于命令和响应,以
\r\n
结尾 - 非结构化数据:存储/检索的实际数据块,服务器会原样传输字节流
关键细节:虽然数据块也以\r\n
结尾,但客户端必须依赖数据长度而非分隔符来确定数据边界,因为数据内容本身可能包含任意字节(包括\r
和\n
)。
键(Key)规范
- 最大长度:250字符
- 禁止包含:控制字符和空白符
- 功能:唯一标识存储的数据
命令类型详解
1. 存储命令
包含6种操作:
set
:存储数据(无条件)add
:仅当键不存在时存储replace
:仅当键存在时更新append
:向现有值追加数据prepend
:向现有值前插数据cas
:带版本检查的原子更新
存储命令格式:
<command> <key> <flags> <exptime> <bytes> [noreply]\r\n
<data block>\r\n
参数说明:
flags
:16/32位无符号整数(客户端自定义标记)exptime
:过期时间(0=永不过期,负数=立即过期)bytes
:数据块字节数noreply
:可选无响应模式
2. 检索命令
包含4种操作:
get
:获取键值gets
:获取键值+CAS令牌gat
:获取并更新过期时间gats
:获取+更新过期时间+CAS令牌
响应格式:
VALUE <key> <flags> <bytes> [<cas>]\r\n
<data>\r\n
...
END\r\n
3. 其他命令
包括删除、计数、触摸等不涉及数据块传输的命令:
delete
:删除键incr/decr
:原子增减数值touch
:更新过期时间flush_all
:清空所有数据
元命令(Meta Commands)革命
元命令是Memcached协议的重要演进,通过标志位系统实现了高度灵活的指令集。
核心优势
- 统一了二进制协议的功能
- 通过标志位组合替代大量独立命令
- 与原有协议完全兼容
通用语法
请求格式:
<2字符命令> <key> <datalen?> <flag1> <flag2>...\r\n
响应格式:
<2字符响应码> <datalen?> <flag1> <flag2>...\r\n
标志位系统
标志位是单字符代码,例如:
q
:静默模式k
:返回键名I
:设置数值t
:获取剩余TTL
标志位可带参数,如Oopaque
传递不透明数据,Kuserkey
指定用户键。
实用特性
- 支持
P
和L
透传参数(用于代理路由) - 错误处理与标准协议一致
- 支持二进制键(通过base64编码)
过期时间处理
Memcached支持两种过期时间表示法:
- 绝对时间戳:Unix时间(32位秒数)
- 相对偏移量:当前时间起的秒数(≤30天)
重要细节:TTL=1可能立即过期,因服务器按秒粒度更新时间。
错误处理体系
ERROR\r
:无效命令CLIENT_ERROR <msg>\r
:客户端协议错误SERVER_ERROR <msg>\r
:服务器端错误(严重时会断开连接)
认证机制
通过模拟set
命令实现认证:
set <ignored> 0 0 <auth_len>\r\n
<username> <password>\r\n
响应:
STORED\r
:成功CLIENT_ERROR\r
:失败
高级操作指南
CAS(检查并设置)
实现原子更新的关键命令流程:
- 使用
gets
获取数据+CAS令牌 - 修改数据
- 使用
cas
命令带令牌更新
数值操作注意事项
incr/decr
要求现有值为合法64位无符号整数- 下溢保护:
decr
结果不低于0 - 上溢处理:
incr
结果会64位回绕
元命令实战示例
获取键值并返回元数据:
mg mykey v t k\r\n
响应可能包含:
- 值数据(
v
标志) - 剩余TTL(
t
标志) - 键名(
k
标志)
性能优化建议
- 连接池:复用TCP连接避免握手开销
- 批量获取:单次
get
请求多个键减少网络往返 - 合理过期:避免使用极短TTL(<1s可能立即失效)
- CAS慎用:仅在必要场景使用版本控制
- 二进制数据:通过元命令的base64支持处理二进制键
通过深入理解Memcached协议规范,开发者可以构建高性能、可靠的缓存解决方案,充分发挥Memcached作为分布式内存缓存系统的优势。
memcached memcached development tree 项目地址: https://gitcode.com/gh_mirrors/mem/memcached
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考