一、概要介绍
在正确安装、启动Memcache服务后,接下来应该为需要使用Memcache服务的应用系统下载相应开发语言的客户端程序包(如Java版客户端,PHP的memcache扩展等),但这里我想先为各位介绍一下Memcache Telnet的基本操作,暂时能想到的原因如下:
1、Telnet是最方便的客户端访问工具,Linux自带或非常容易安装。
2、能够最方便、最直接的了解Memcache功能的基本使用,比如set,get命令的使用。
3、在应用系统运维期间,对Memcache的部分操作可以在Telnet中完成,如清空缓存,查看数据确认应用系统是否正常使用Memcache服务等。
4、为以后阅读Memcache客户端开发包打下基础,Memcache客户端其中一个核心的功能就是在代码里拼接Memcache的访问命令,然后通过Socket通信将命令传输到Memcache服务端节点。
二、telnet请求命令格式
<Command name> <key> <flags> <exptime> <bytes>\r\n
<data block> \r\n
简单解释
<Command name>
:可以是add,set,replace等
<key>
:为memcache key键的名称,要求唯一
<flags>
:是一个16位的无符号整数(10进制),该标志和需要存储的数据一起存储,并在客户端get数据时返回。客户可以将此标志用做特殊用途,此标志对服务器来说是透明的。
<exptime>
:过期的时间,单位为秒,设置为0表示永不过期。
<bytes>
:需要存储的字节数(不包含最后的“\r\n ”),可以为0,表示空数据。
\r\n:命令结尾标识符,在telnet界面输入命令时按回车键即可。
<data block>
:表示存储的数据内容,即value。
三、telnet命令响应
Stored 表示存储成功
not_stored:表示存储失败(命令正确,但操作不对)
Error:表示命令错误
四、常用命令
命令 | 命令说明 | 示例 | 备注 |
get | 获取值 | get mykey | |
set | 设定一个值 | set mykey 0 60 5 | |
add | 添加一个值 | add mykey 0 60 5 | |
replace | 替换值 | replace mykey 0 60 5 | |
append | 在后面追加值 | append mykey 0 60 5 | |
prepend | 在前面追加值 | prepend mykey 0 60 5 | |
incr | 数值类的值增加给定数字值 | incr mykey 2 | |
decr | 数值类的值减少给定数字值 | decr mykey 5 | |
flush_all | 刷新items:有两种使用方法 ,立即刷新和延迟指定时间后刷新。 | flush_all /flush_all 100 | 立即刷新;/延迟N秒后刷新; |
stats | 普通stats查询 | stats | |
内存块使用查询 | stats slabs | 显示各个slab的信息,包括chunk的大小,数目,使用情况等 | |
(不能使用了) | stats malloc | ||
查询分配的item | stats items | 显示各个slab中item的数目和最老item的年龄 | |
stats详细信息操作命令,有on/off/dump三个选项 | stats detail on | ||
统计数量 | stats sizes | ||
重置 | stats reset | 清空统计数据 | |
version | 查看服务端版本 | version | |
verbosity | 提升日志级别,有info/error级别可供选择 | verbosity info | |
quit | 退出 | quit | |
注意:
1)get,set等命令执行完后,敲回车,输入值的内容,再敲回车即可看到stored字样。
2)add,set,replace等命令操作同一个item时,超时时间 以最后一个为准。
3)incr/decr命令,decr的结果最小为0,不会出现负数的情况。
五、stats 命令详解
名称 | 说明 | 示例 |
pid | memcache服务器的进程ID | STAT pid 2713 |
uptime | 服务器已经运行的秒数 | STAT uptime 315 |
time | 服务器当前的unix时间戳 | STAT time 1451121349 |
version | memcache版本 | STAT version 1.4.25 |
pointer_size | 当前操作系统的指针大小(32位系统一般是32bit,64位系统为64) | STAT pointer_size 64 |
rusage_user | 进程的累计用户时间 | STAT rusage_user 0.001999 |
rusage_system | 进程的累计系统时间 | STAT rusage_system 0.081987 |
curr_items | 服务器当前存储的items数量 | STAT curr_items 0 |
total_items | 从服务器启动以后存储的items总数量 | STAT total_items 2 |
bytes | 当前服务器存储items占用的字节数 | STAT bytes 0 |
curr_connections | 当前打开着的连接数 | STAT curr_connections 5 |
total_connections | 从服务器启动以后曾经打开过的连接数 | STAT total_connections 6 |
connection_structures | 服务器分配的连接构造数 | STAT connection_structures 6 |
cmd_get | get命令(获取)总请求次数 | STAT cmd_get 5 |
cmd_set | set命令(保存)总请求次数 | STAT cmd_set 2 |
get_hits | 总命中次数 | STAT get_hits 3 |
get_misses | 总未命中次数 | STAT get_misses 2 |
evictions | 为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items) | STAT evictions 0 |
bytes_read | 总读取字节数(请求字节数) | STAT bytes_read 137 |
bytes_written | 总发送字节数(结果字节数) | STAT bytes_written 1258 |
limit_maxbytes | 分配给memcache的内存大小(字节) | STAT limit_maxbytes 134217728 |
threads | 当前线程数 | STAT threads 4 |
注意:输入命令返回的示例,都带了STAT 前缀的。
Memcache1.4.25 stats命令新增了较多新的属性,此列表列举的还是较老版本的属性,未列出的属性可根据名称了解大致的作用即可。
六、stats slabs命令详解
显示各个slab的信息,包括Chunk的大小,数目,使用情况等。
名称 | 说明 | 示例 |
chunk_size | chunk的大小 | STAT 1:chunk_size 96 |
chunks_per_page | 每个page分配的chunk数量 | STAT 1:chunks_per_page 10922 |
total_pages | page数量,单位为M | STAT 1:total_pages 1 |
total_chunks | chunk总数(等于chunks_per_page *total_pages ) | STAT 1:total_chunks 10922 |
used_chunks | 使用的chunks | STAT 1:used_chunks 0 |
free_chunks | 闲置的chunks | STAT 1:free_chunks 10922 |
free_chunks_end | 新分配的但是未使用的chunk数 | STAT 1:free_chunks_end 0 |
mem_requested | 实际占用的内存大小 | STAT 1:mem_requested 0 |
get_hits | 总命中次数 | STAT 1:get_hits 3 |
cmd_set | set命令总请求次数 | STAT 1:cmd_set 2 |
delete_hits | delete命令总请求次数 | STAT 1:delete_hits 0 |
incr_hits | incr命令总请求次数 | STAT 1:incr_hits 0 |
decr_hits | decr命令总请求次数 | STAT 1:decr_hits 0 |
cas_hits | cas命令总请求次数 | STAT 1:cas_hits 0 |
cas_badval | cas擦试请求总数 | STAT 1:cas_badval 0 |
touch_hits | touch命令总请求次数 | STAT 1:touch_hits 0 |
active_slabs | 活动的slab总数,编号不一定连续,是按内存区间排定的 | STAT active_slabs 1 |
total_malloced | 实际已分配的总内存数,单位为byte | STAT total_malloced 1048512 |
注意:
1)total_chunks的两则计算公式
total_chunks=used_chunks+free_chunks+free_chunks_end
total_chunks=chunks_per_page *total_pages
2)输入命令返回的示例,都带了STAT 1前缀的,1为slab编号。最后两行其实是该命令的统计行,注意前缀为STAT 。
七、stats imtes命令详解
显示各个slab中的item的数目和最老item的年龄(最后一次访问距离现在的秒数)
名称 | 说明 | 示例 |
number | 当前slab存储的chunk总数。 | STAT items:1:number 1 |
age | 最老item的年龄 | STAT items:1:age 5 |
evicted | 被释放的个数 | STAT items:1:evicted 0 |
evicted_nonzero | 显示未达到存活期的,但是被释放的items总数 | STAT items:1:evicted_nonzero 0 |
evicted_time | 最后被释放的缓存对象时间 | STAT items:1:evicted_time 0 |
outofmemory | 申请内存失败的次数 | STAT items:1:outofmemory 0 |
tailrepairs | slab内部执行LRU算法清理item对象出现内存泄露时,自行解决恢复的次数 | STAT items:1:tailrepairs 0 |
reclaimed | 因为超时而被回收的次数 | STAT items:1:reclaimed 0 |
expired_unfetched | slab内部执行LRU算法清理item对象,过期item未取到的次数 | STAT items:1:expired_unfetched 0 |
evicted_unfetched | slab内部执行LRU算法清理item对象,释放item未取到的次数 | STAT items:1:evicted_unfetched 0 |
crawler_reclaimed | 过期item对象失效被回收的次数 | STAT items:1:crawler_reclaimed 0 |
crawler_items_checked | item回收的次数 | STAT items:1:crawler_items_checked 0 |
lrutail_reflocked | 执行LRU算法回收内存对象时,被多个线程加锁导致无法正确回收的次数(属于意外情况,正常情况是只被一个线程加锁) | STAT items:1:lrutail_reflocked 0 |
注意:
1)输入命令返回的示例,都带了STAT items:1前缀的,1为slab的编号。
2)如果evicted的个数很大,说明需要经常剔除,那么就是节点分配的内存不够,若reclaimed的个数很大,则说明经常会有超时现象,那么缓存的时间应该设置长些。
3)这里有几个参数都是跟memcache的LRU内存替换算法相关的,在memcache源码的item.c类里,各位有兴趣可作深入研究。
八、Stats命令观测
1、limit_maxbytes,bytes
limit_maxbytes为总的存储大小,而bytes就是已经使用的大小,从这两个数据就可以看出在memcache启动时,我们的内存是否足够使用。
2、cmd_get,cmd_set
可以查看应用程序一共对它做了多少次读取操作。
3、get_hits,get_missess
用来评估缓存命中率,可以评估我们使用的策略是否合理。
get_hits表示命中了多少次读取,get_misses表示没有命中的次数。一般来说:cmd_get=get_hits+get_missess。
命中率计算:命中率=(get_hits/cmd_get) *100%。
4、flush_all
并不会将item直接删除,只是将所有的items标记为expired,因此这时memcache依旧占有所有内存
问:什么时候会清内存?等待GC?
九、高级缓存细节查看方法
1、stats cachedump slab_id limit_num
显示某个slab中的前limit_num个key列表,slab_id为slab的id号,通过命令stats slabs得到。
列表格式:
ITEM key_name [value_length b; expire_times s]
其中,1.2.4版本以上显示的是过期时间,若永不过期,expire_time会显示为服务器启动时间。value_length后面的b为长度单位,固定显示符为b,表示byte。
例:添加缓存对象 add a 0 60 2 (value为bb)则列表为
ITEM a [2b; 1442649438 s]
2、stats detail [on/off/dump]
设置或者显示详细操作记录
on:打开详细操作记录
off:关闭详细操作记录
dump:显示详细操作记录(每一个键值get,set,hit,del的次数)
问:操作记录在哪儿能看到?是不是在memcached的日志里?
3、memcache cas操作
搭配gets一起使用,用来解决并发的一些问题。
gets可以查询出当前的唯一版本号。
cas带更新时,要带上最新的版本号,否则更新失败。
示例(假设key值为aa)
cas命令解释
注意:cas的唯一版本号必须是gets的最新值,否则更新失败,会提示Exists。操作正常提示STORED,如下图所示,当前最新版本号为2
原文地址:http://blog.youkuaiyun.com/dailywater/article/details/50783636