memcache 原理 & 监测 & 查看状态 & stats & 结构
Mencache内存存储方式:slab/LRU,采用预先申请固定大小的内存页(slab/page),然后再把内存分成多个块(chunk)
先放一张从网上找到的memcache内存结构图,觉得非常的赞:
再来一张memcache slab内存分配图,最讨厌看图了,但是看到这图对memcache的内存分配豁然开朗,于是决定以后要多看图。
Item内存结构图:
item就是存放在chunk中的实际数据,
新建Item分配内存过程
计算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
其他命令
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