memcache 原理 & 监测 & 查看状态 & stats & 结构

 Mencache内存存储方式:slab/LRU,采用预先申请固定大小的内存页(slab/page),然后再把内存分成多个块(chunk)

先放一张从网上找到的memcache内存结构图,觉得非常的赞:

再来一张memcache slab内存分配图,最讨厌看图了,但是看到这图对memcache的内存分配豁然开朗,于是决定以后要多看图。

Item内存结构图

item就是存放在chunk中的实际数据,

新建Item分配内存过程

快速定位slab classid
计算key+value+suffix+32结构体,如90byte (key键长+suffix+value值长+结构大小(32字节)
如果>1MB,无法存储丢弃
取最小冗余的slab class
如:有48,96,120,存90会选择96

按顺序寻找可用chunk
slot:检查slab回收空间slot里是否有剩余chunk
delete:delete时标记到slot
exptime:get时检查的过期对象标记到slot
end_page_ptr:检查page中是否有剩余chunk
memory:内存还有剩余则开辟新的slab
LRU:Slab内部扫描Item双向链表50次
 

Memcache命令

连接memcache测试: telnet  ip port,如telnet 127.0.0.1 11211

存储命令格式

<command> <key> <flags> <exptime> <bytes> [<version>]\r\n
<datablock>\r\n

 

command set无论如何都进行存储
add只有数据不存在时进行添加
repalce只有数据存在时进行替换
append往后追加:append <key> datablock <status>
prepend往前追加:prepend <key> datablock <status>

cas按版本号更改
key 字符串,<250个字符,不包含空格和控制字符
flags 客户端用来标识数据格式的数值,如json,xml,压缩等
exptime 存活时间 s 以秒为单位,0为永远,<30天60*60*24*30为秒数,>30天为unixtime
bytes byte字节数,不包含\r\n,根据长度截取存/取的字符串,可以是0,即存空串
datablock 文本行,以\r\n结尾,当然可以包含\r或\n

 

例:

##存入数据,特别注意bytes(也就是下面那个5),bytes指明datablock字节数(\r\n算两个字节)。如果bytes与你实际输入的datablock字节数不一致,会报client_error错误。
set testzhong_liu 0 3600 5
ab
c
STORED

get testzhong_liu
VALUE testzhong_liu 0 5
ab
c
END

 

读取命令格式:

<command> <key>[ key1[ key2...]\r\n

get testzhong_liu testcook
VALUE testzhong_liu 0 5
ab
c
END

计数命令incr/decr

incr/decr <key> <int>

key必需存在

value必需是数值

删除命令delete

delete <key> [<time>]

统计命令

stats
STAT pid 1014                  //Memcache进程ID
STAT uptime 8122               //Memcached运行时间,单位:秒
STAT time 1357359669           //Memcached当前的UNIX时间
STAT version 1.4.7             //Memcached的版本号
STAT libevent 2.0.19-stable    
STAT pointer_size 64
STAT rusage_user 0.144009      //该进程累计的用户时间,单位:秒
STAT rusage_system 0.064004    //该进程累计的系统时间,单位:秒
STAT curr_connections 10       //当前连接数量
STAT total_connections 34      //Memcached运行以来接受的连接总数
STAT connection_structures 11  //Memcached分配的连接结构的数量
STAT cmd_get 64                //查询请求总数
STAT cmd_set 10                //存储(添加/更新)请求总数
STAT cmd_flush 0               //flush请求总数
STAT get_hits 60               //查询成功获取数据的总次数
STAT get_misses 4              //查询成功未获取到数据的总次数
STAT delete_misses 0           
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 10753          //Memcached从网络读取到的总字节数
STAT bytes_written 227141      //Memcached向网络发送的总字节数
STAT limit_maxbytes 67108864   //Memcached在存储时被允许使用的字节总数
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 8416                //Memcached当前存储内容所占用字节数
STAT curr_items 4              //Memcached当前存储的内容数量
STAT total_items 7             //Memcached启动以来存储过的内容总数
STAT evictions 0               //LRU释放对象数,用来释放内存
STAT reclaimed 0
END



stats settings

stats items

stats sizes

stats slabs

其他命令

-version
-flush_all
-quit
-echo|nc 快捷方式
echo get testzhong_liu | nc localhost 11210  

知识点:

windows下修改memcached运行参数:
1>开始>运行:regedit(回车)
2>在注册表中找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server
3>默认的ImagePath键的值是:"c:\memcached\memcached.exe" -d runservice,改为:"c:\memcached\memcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55
4>我的电脑(右键)>管理>服务 找到memcache的服务,重新启动一次即可生效。

参考:http://blog.csdn.net/zhxp_870516/article/category/1310409/1

posted @ 2014-01-09 09:39  luffy_zhong  阅读(923)  评论(0编辑  收藏  举报