Memcached协议详解:从基础命令到元命令操作指南

Memcached协议详解:从基础命令到元命令操作指南

memcached memcached development tree memcached 项目地址: https://gitcode.com/gh_mirrors/mem/memcached

协议概述

Memcached采用基于TCP的文本协议进行客户端与服务器通信(也支持UDP协议)。客户端通过建立TCP连接到Memcached服务器的指定端口,发送命令并读取响应,完成操作后可随时关闭连接。

连接管理最佳实践:建议客户端缓存连接而非频繁创建新连接。Memcached专为处理大量并发连接(数百甚至上千)而优化,连接复用可避免TCP三次握手带来的性能损耗。

数据传输格式

协议中传输两种类型数据:

  1. 文本行:用于命令和响应,以\r\n结尾
  2. 非结构化数据:存储/检索的实际数据块,服务器会原样传输字节流

关键细节:虽然数据块也以\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指定用户键。

实用特性

  • 支持PL透传参数(用于代理路由)
  • 错误处理与标准协议一致
  • 支持二进制键(通过base64编码)

过期时间处理

Memcached支持两种过期时间表示法:

  1. 绝对时间戳:Unix时间(32位秒数)
  2. 相对偏移量:当前时间起的秒数(≤30天)

重要细节:TTL=1可能立即过期,因服务器按秒粒度更新时间。

错误处理体系

  1. ERROR\r:无效命令
  2. CLIENT_ERROR <msg>\r:客户端协议错误
  3. SERVER_ERROR <msg>\r:服务器端错误(严重时会断开连接)

认证机制

通过模拟set命令实现认证:

set <ignored> 0 0 <auth_len>\r\n
<username> <password>\r\n

响应:

  • STORED\r:成功
  • CLIENT_ERROR\r:失败

高级操作指南

CAS(检查并设置)

实现原子更新的关键命令流程:

  1. 使用gets获取数据+CAS令牌
  2. 修改数据
  3. 使用cas命令带令牌更新

数值操作注意事项

  • incr/decr要求现有值为合法64位无符号整数
  • 下溢保护:decr结果不低于0
  • 上溢处理:incr结果会64位回绕

元命令实战示例

获取键值并返回元数据:

mg mykey v t k\r\n

响应可能包含:

  • 值数据(v标志)
  • 剩余TTL(t标志)
  • 键名(k标志)

性能优化建议

  1. 连接池:复用TCP连接避免握手开销
  2. 批量获取:单次get请求多个键减少网络往返
  3. 合理过期:避免使用极短TTL(<1s可能立即失效)
  4. CAS慎用:仅在必要场景使用版本控制
  5. 二进制数据:通过元命令的base64支持处理二进制键

通过深入理解Memcached协议规范,开发者可以构建高性能、可靠的缓存解决方案,充分发挥Memcached作为分布式内存缓存系统的优势。

memcached memcached development tree memcached 项目地址: https://gitcode.com/gh_mirrors/mem/memcached

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨元诚Seymour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值