memcached协议

旧版:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

新版:https://github.com/memcached/memcached/blob/master/doc/protocol.txt

一、协议

memcached的客户端使用TCP连接同memcached进行交互,memcached服务器监听指定的端口(默认端口是11211)。Client连接到memcached服务器,发送指令,获取数据,然后关闭连接。

通常没有必要发送任何命令来关闭某个会话。客户端可以在任何时候关闭不需要的连接。然而,通常鼓励客户端缓存这些连接,因为memcached服务器本身就被设计成为一个可以支持成百上千个连接的服务器,而客户端缓存了连接后,就可以避免重复的建立连接的开销。

memcached协议中包含两部分数据,文本行和非结构化数据。前者是来自客户端的命令或来自服务器端的响应,后者代表客户端存取的数据。命令以\r\n结尾,数据可以是\r,\n或者\r\n结尾来标识各自部分的结束。

二、键

memcached一般通过key来存储,一个key的长度一般不能超过250字符。key不能包含控制字符或空白字符

三、命令

有三种类型的命令:

1、存储命令:set、add、replace、append、prepend、cas

2、读取命令:get、gets

3、第三种命令,不涉及到非结构化数据。客户端发出这样的命令,服务端会返回响应结果

1、过期时间

过期时间的取值,有两种:一种是Unix时间(自1970.1.1开始到现在的秒数),另一种是相对当前时间的秒数。如果过期时间的秒数大于60*60*24*30(即30天),则服务端认为是Unix时间。

2、错误设置

客户端发出的每个命令,服务端可能会返回错误提示字符。错误提示字符有如下三种:

1)  ERROR\r\n :表示客户端发送的命令不存在

2)  CLIENT_ERROR <error>\r\n :表示客户端的输入有错误

3)  SERVER_ERROR <error>\r\n :服务器端的错误

3、存储命令:

命令格式:<command name> <key><flags> <exptime> <bytes> [noreply]\r\n

命令名:如set、add、replace、append、prepend

命令名称

作用

set

存储这个数据

add

存储这个数据,当且仅当这个key不存在的时候

replace

存储这个数据,当且仅当这个key存在

append

将数据存放在已存在的key对应的内容的后面,忽略<flags>和<exptime>

prepend

将数据存放在已存在的key对应的内容的前面,忽略<flags>和<exptime>

cas

存储这个数据,当且仅当该数据自从最后被获取到现在没有被更新

flags:一个任意的32位(旧版本是16位)无符号整数

exptime:过期时间,如果为0,表示永不过期。单位秒

bytes:表示将要存储的数据的字节数,可以为0。要存储的内容的字节数,必须等于该值,不能大于也不能小于。

例子:将一个整数12,存放到memcache中,key为var,flags为1,过期时间为1000,字节数为2

用telnet连接memcached服务器端:

输入命令如下:set var 1 1000 2,然后按回车,之后输入要存储是数据:12,按回车,服务器返回STORED,如下:

通过get命令查看刚才存储的内容:

4、获取命令

格式:

get  <key>*\r\n

gets <key>*\r\n

<key>*,表示可以有多个key,各个key之间用空格隔开。

执行该命令,服务器返回0个或多个item,每个item的格式如下:

VALUE <key> <flags><bytes> [<cas unique>]\r\n

<data block>\r\n

bytes为数据内容的长度,data block为key对应的数据内容

例子:

5、删除命令

格式: delete <key> [noreply]\r\n

noreply参数,告诉服务器不用发送响应

该命令的返回结果,可能是:

DELETE\r\n       表示删除成功

NOT_FOUND\r\n   没有对应的key

例子:

6、增加/减少命令

命令格式:

incr <key> <value> [noreply]\r\n   或   decr <key> <value> [noreply]\r\n

value为要增加或减少的值。

操作成功,服务器返回操作之后的值。

对于decr操作,如果操作之后的值小于0,则置为0

不能直接使用incr和decr,必须先set或者add后再使用,而且值为数字类型,在增加时,存储的区域会扩展。

例子:

7、touch

该命令用来更新已存在的item的过期时间,格式如下:(低版本不支持该命令)

touch <key> <exptime> [noreply]\r\n

执行该命令后,如果返回”TOUCHED\r\n”,则执行成功

8、统计命令

命令格式:

1)    stats\r\n         查看通用的统计信息

2)    stats <args>\r\n

通用统计信息,例子:

具体含义:

名称

类型

含义

pid

32u (32位无符号整数)

memcached server的pid

uptime

32u

memcached server自启动到现在的时间(秒)

time

32u

当前UNIX的时间

version

string

memcached server的版本号

pointer_size

32

操作系统默认的指针大小

curr_items

32u

当前存储的item数目

total_items

32u

server从启动到现在,总共累计存储的item数目

bytes

64u

当前存储item所花费的字节数

curr_connections

32u

当前的客户端连接数

total_connections

32u

server从启动到现在,累计的客户端连接数

connection_structures

32u

server分配的连接结构数

cmd_get

64u

get的次数

cmd_set

64u

set的次数

get_hits

64u

get命中的次数

get_misses

64u

get没有命中,miss的次数

evictions

64u

为新的item释放内存空间而被移除的有效item的数目。如果cache的size比较小,则淘汰策略经常发生

bytes_read

64u

从cache中读取的总字节数

bytes_written

64u

写入cache的总字节数

limit_maxbytes

32u

该memcached server分配的最大内存数量

9、item统计信息

stats命令后面带上参数:items。  返回存储在每个slab的item信息,格式如下:

STAT items:<slabclass>:<stat><value>\r\n

例子:

10、itemsize统计信息

stats命令后面带上参数sizes,返回存储在cache中的总体大小及item数目。

注意:该命令会锁住cache,它会遍历每个item并计算大小,在此之间,我们是无法访问server的,因此要慎重使用该命令。

返回结果的格式如下:

<size> <count>\r\n

其中:

'size' is an approximate size of the item,within 32 bytes.

'count' is the amount of items that existwithin that 32-byte range.

例子:

11、slab统计信息

stats命令带上参数slabs,返回memcached运行期间创建的每个slab的信息。

数据格式:STAT <slabclass>:<stat> <value>\r\n

例子:

名称

含义

chunk_size

每个块的大小。一个item使用一个大小适当的块。

chunks_per_page

一页的块数,一页的默认大小小于等于1M,,chunks_per_page * chunk_size = 1MB。 slab按页分配,每页划分成不同的块

total_pages

分配给slab的页数

total_chunks

分配给slab的块数

used_chunks

已分配给item的块数

free_chunks

未分配给item的块数

free_chunks_end

目前可以使用的块数

mem_requested

请求存储在该slab的字节数

active_slabs

已经分配的slab数量

total_malloced

已经分配给slab的字节数

item存放在slab中,该slab的大小大于或等于该item的大小。mem_requested表示一个slab中所有item的大小。

total_chunks * chunk_size – mem_requested,表示一个slab中所浪费的内存大小。如果有很多浪费,则需要考虑调整slab因子

12、其他命令

1)   flush_all :执行该命令,将导致memcache中所存在的所有item都失效。也可以指定在一段时间之后失效。例子:

2)   version : 查看memcache的版本号

3)quit :关闭连接

memcached协议的更多相关文章

  1. Mcrouter-基于Memcached协议的缓存层流量管理工具(Memcached集群的另一个选择)(转)

    Mcrouter 是一个基于Memcached协议的路由器,它是 Facebook缓存架构的核心组件,在峰值的时候,它能够处理每秒50亿次的请求.近日,Facebook开放了Mcrouter的源代码, ...

  2. 用muduo实现memcached协议的例子

    最近花了两天时间用 muduo 部分实现了 memcached 服务器协议,代码位于 examples/memcached/server,能通过 memcached 的大部分测试用例(incr/dec ...

  3. memcached协议解析

    本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...

  4. 利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)

    Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley D ...

  5. memcached协议解析 及使用

    本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...

  6. Memcached(四)Memcached的CAS协议

    1. 什么是CAS协议很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写.Google.com一下,CAS是 ...

  7. 网络协议之:memcached binary protocol详解

    目录 简介 memcached的协议包 memcached命令举例 总结 简介 前面讲到了memcached的文本协议,虽然文本协议看起来非常简单,但是对于客户端来说一般还是会选择效率更高的二进制协议 ...

  8. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  9. Memcached初探

    一.Memcached是什么 Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. Memcached基于 ...

随机推荐

  1. 招聘一个靠谱的 iOS程序员

    一个靠谱的简历 简历非常能反映一个人的性格和水平,相比于你在学校获得多少奖项,工作经历.项目经 历.熟悉的技术等更加关键,如果还有博客和一些 Github 上的项目,好感度++,但记得在去面试前收拾下 ...

  2. 如何获取QQ里的截图app?

    电脑系统平台:OS X EI Capitan 10.11 在以前的旧的QQ版本,QQ的截图的偏好还有一个开机自启动的选项: 现在新的版本,却没有了"开机自动运行"的选项,然而有时候 ...

  3. 在MAC平台下使用Eclipse出现了中文乱码

    在Preference(偏好设置)中,搜索框中输入content找到Content Types,然后在text中找到并选中Java Source File, 然后在Defalut encoding输入 ...

  4. 《第一行代码——Android》

    <第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...

  5. python数据结构-列表-建立/索引/反转

  6. 查看mysql主从配置的状态及修正 slave不启动问题

    1.查看master的状态 mysql> show master status;  //Position不应该为0 mysql> show processlist;  //state状态应 ...

  7. PHP模拟发送POST请求之一、HTTP协议头部解析

    WEB开发中信息基本全是在POST与GET请求与响应中进行,GET因其基于URL的直观,易被我们了解,可POST请求因其信息的隐蔽,在安全的同时,也给开发者们模拟发送带来了麻烦.接下来的几篇博文中,我 ...

  8. SQL Server 2008 R2——VC++ ADO 操作 存储过程

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  9. POI教程之第一讲:创建新工作簿, Sheet 页,创建单元格

    第一讲 Poi 简介 Apache POI 是Apache 软件基金会的开放源码函数库,Poi提供API给java程序对Microsoft Office格式档案读和写的功能. 1.创建新工作簿,并给工 ...

  10. popupWindow弹出来后,背景变暗,半透明

    /** * 点击评分,如果评分后,显示的弹出框 */ private void showMakeGradeMarkedWindow() { View view = LayoutInflater.fro ...