Let's Go!

05_Memcached 命令操作

上一篇 / 下一篇  2011-05-09 10:48:27 / 个人分类:JAVA学习&编程相关

 

三篇文章

一、转 Memcached 命令操作
http://af1200.blog.163.com/blog/static/1713227420108291133436/

对于Memcached 缓存系统的基本介绍、安装以及应用之前有一编文章说过,下面主要是对使用Memcached系统的基本命令以及协议作个简单的分析,个人学习的笔记,呵呵。还希望能给需要的筒子一点参考:

一、Memcache面向对象的常用接口包括:
Memcache::connect -- 打开一个到Memcache的连接
Memcache::pconnect -- 打开一个到Memcache的长连接
Memcache::close -- 关闭一个Memcache的连接
Memcache::set -- 保存数据到Memcache服务器上
Memcache::get -- 提取一个保存在Memcache服务器上的数据
Memcache::replace -- 替换一个已经存在Memcache服务器上的项目
Memcache::delete -- 从Memcache服务器上删除一个保存的项目
Memcache::flush -- 刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目)
Memcache::getStats -- 获取当前Memcache服务器运行的状态

For More:
http://cn.php.net/memcache

二、查看系统的运行状态:

stats
pid               Process id of this server process (memcache服务器的进程ID)
uptime            Number of seconds this server has been running (服务器已经运行的秒数)
time              Current UNIX time according to the server (服务器当前的UNIX时间)
version           Version string of this server (memcache版本)
pointer_size      Current system pointer 当前操作系统的指针大小(32位系统一般是32bit)
rusage_user       Accumulated user time for this process (该进程累计的用户时间(秒:微妙))
rusage_system     Accumulated system time for this process (该进程累计的系统时间(秒:微妙))
curr_items        Current number of items stored by the server (服务器当前存储的内容数量)
total_items       Total number of items stored by this server ever since it started (服务器启动以来存储过的内容总数)
bytes             Current number of bytes used by this server to store items (服务器当前存储内容所占用的字节数)
curr_connections  Number of open connections (当前打开着的连接数量)
total_connections Total number of connections opened since the server started running (服务器运行以来接受的连接总数)
connection_structures Number of connection structures allocated by the server (服务器分配的连接结构的数量)
cmd_get             Cumulative number of retrieval requests (get命令(获取)总请求次数)
cmd_set             Cumulative number of storage requests (set命令(保存)总请求次数)
get_hits            Number of keys that have been requested and found present (请求成功的总次数)
get_misses          Number of items that have been requested and not found (请求失败的总次数)
threads             Current number of thread (当前线程数)
bytes_read          Total number of bytes read by this server from network (服务器从网络读取到的总字节数)
bytes_written       Total number of bytes sent by this server to network (服务器向网络发送的总字节数)
limit_maxbytes      Number of bytes this server is allowed to use for storage. (服务器在存储时被允许使用的字节总数)
evictions           Number of valid items removed from cache to free memory for new items (为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items))

其中,最关注最多的几个参数:
uptime:是memcached运行的秒数。
cmd_get:是查询缓存的次数。
cmd_get/uptime 结果是平均每秒请求缓存的次数——结果值越大,说明Memcached的利用率越高,站点的访问量大,如果太低,用文件系统缓存就可以了,根本不会体现出使用memcached的强大性能。
cmd_set:是设置key=>value的次数。整个memcached是个大hash,用cmd_get没有找到的内容,就会调用一下cmd_set写进缓存里。
get_hits:是缓存命中的次数。所谓的命中率 = get_hits/cmd_get * 100%。
get_misses:是缓存未命中的次数。get_misses加上get_hits就等于cmd_get。
stats:显示服务器信息、统计数据等
stats reset:清空统计数据

stats slabs:显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats items:显示各个slab中item的数目和存储时长(最后一次访问距离现在的秒数)
quit:退出

三、利用shell命令操作Memcached
1、数据存储(key为wan,value为123)
set
2、数据取回
get
3、替换数据(将以wan为key存储的值替换为122)
replace
4、数值增加 1
incr
5、数值减少 2
decr
6、数据删除
delete
7、查看Memcached当时状态
printf "stats\r\n" | nc 127.0.0.1 11211
8、查看Memcached实时状态

watch "printf 'stats\r\n' | nc 127.0.0.1 11211"

watch

Memcached protocol 中英文档可以参考:

http://blog.s135.com/book/memcached/

四. 查看slabs的使用状况
使用memcached的创造着Brad写的名为 memcached-tool 的Perl脚本,可以方便地获得slab的使用情况(它将memcached的返回值整理成容易阅读的格式)。可以从下面的地址获得脚本:
http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool
[root@localhost html]# vim memcached-tool
[root@localhost html]# chmod +x memcached-tool
[root@localhost html]# ./memcached-tool 127.0.0.1:11211
  #  Item_Size   Max_age  1MB_pages Count   Full?
  1      80 B        0 s               1           0      no
  2     104 B       12175 s         1           1      no
  3     176 B    1339587 s       33       196567  yes

各列的含义:
#: slab class编号
Item_Size: Chunk大小
Max_age: LRU内最旧的记录的生存时间
1MB_pages: 分配给Slab的页数
Count: Slab内的记录数
Full?: Slab内是否含有空闲chunk

五. 也可以图形化监控 Memcached 的运行状态
http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/
是一个PHP源文件,只需要修改源码中的用户名、密码以及数组$MEMCACHE_SERVERS 就可以了。

 

 

 

二、命令行查看Memcached运行状态
http://blog.csdn.net/chenhongxin/archive/2010/11/11/6002764.aspx

命令行查看Memcached运行状态

很多时候需要监控服务器上的Memcached运行情况,比如缓存的查询次数,命中率之类的。但找到的
那个memcached-tool是linux下用perl写的,我也没试过windows能不能用。后来发现个简单的办法
可以做到,就是使用Telnet。
首先登录到服务器,然后在cmd命令行中键入
telnet 127.0.0.1 11211
其中127.0.0.1是服务器的地址(这里是本机) ,11211是memcached绑定的端口号。
之后命令行窗口全黑只有光标提示,摸黑输入stats,即可得到描述Memcached服务器运行情况的参
数。如下图:
 
其中,uptime 是memcached运行的秒数,cmd_get是查询缓存的次数。这两个数据相除一下就能得到
平均每秒请求缓存的次数——最近niupu的流量很低,所以平均也就一秒请求一次多,这么点大的压
力,用文件系统缓存一样没问题,根本不会体现出使用memcached的优越。
下面的cmd_set 就是设置key=>value的次数。整个memcached是个大hash,用cmd_get没有找到的内
容,就会调用一下cmd_set写进缓存里。紧跟着是get_hits,就是缓存命中的次数。缓存命中率 =
get_hits/cmd_get * 100%。
下面的get_misses的数字加上get_hits应该等于cmd_get。而total_itemscurr_items表示现在在缓
存中的键值对个数,在图上total_items == cmd_set == get_misses,不过当可用最大内存用光时
,memcached就会删掉一些内容,上面的等式就不成立了。
话说回来,memcached要是能有一套完整的监测工具就太好了。memcached的安装和php相应配置请看
这里。


Memcached的stats命令

 telnet到memcached服务器后有很多的命令可以使用,除了大家熟知的add、get、set、incr、decr、replace、delete等赋值命令外,还有一系列的获取服务器信息的命令,这部分命令都是以stats开头的。
用PHP的Memcache::getStats($cmd)也可以访问这些命令

常用的命令

stats
显示服务器信息、统计数据等

stats reset
清空统计数据

stats malloc
显示内存分配数据

stats cachedump slab_id limit_num
显示某个slab中的前limit_num个key列表,显示格式如下
ITEM key_name [ value_length b; expire_time|access_time s]
其中,memcached 1.2.2及以前版本显示的是  访问时间(timestamp)
1.2.4以上版本,包括1.2.4显示 过期时间(timestamp)
如果是永不过期的key,expire_time会显示为服务器启动的时间

stats cachedump 7 2
ITEM copy_test1 [250 b; 1207795754 s]
ITEM copy_test [248 b; 1207793649 s]

stats slabs
显示各个slab的信息,包括chunk的大小、数目、使用情况等

stats items
显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)

stats detail [on|off|dump]
设置或者显示详细操作记录


参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

stats detail dump
PREFIX copy_test2 get 1 hit 1 set 0 del 0
PREFIX copy_test1 get 1 hit 1 set 0 del 0
PREFIX cpy get 1 hit 0 set 0 del 0


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenhongxin/archive/2010/11/11/6002764.aspx

 

 

三、memcached命令解析

http://apps.hi.baidu.com/share/detail/24796149#

memcached命令
    • 标准协议
      • No Reply
    • 存储命令
      • set命令
      • add命令
      • replace命令
      • append命令
      • prepend命令
      • cas命令
    • 读取命令
      • get命令
      • gets命令
    • 删除命令
    • incr/decr命令
    • 查看memcached使用状态
      • stats命令
      • stats items命令
      • stats slabs命令
      • stats sizes命令
    • flush_all命令

全部协议在Protocol Documentation



标准协议

memcached所有的标准协议包含在对item执行命令过程中,一个item包含:

  • 一个key
  • 一个32位的标志值
  • 以秒为单位的失效时间
  • 一个64为的CAS值,这个是唯一的
  • 数据

CAS是可选的,可以使用“

-C

”禁止CAS。

No Reply

大多数ascii命令允许“noreply”。建议大家在ascii协议下别用“noreply”,因为那样不会报请求错误。“noreply”的目的是在执行交互命令(如:set、add)后,避免等待返回的包。

二进制协议将“noreply”定义为声明。如果你的客户端支持或者使用二进制协议,那么你将会用到它。


存储命令

首先客户端向服务器按照如下格式发送命令行:

<command name> <key> <flags> <exptime> <bytes>\r\n


    a) <command name> 可以是"set", "add", "replace"。

        "set"表示按照相应的<key>存储该数据。

        "add"表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。

        "replace"表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败


    b) <key> 客户端需要保存数据的key。


    c) <flags> 是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。


    d) <exptime> 过期的时间。如果该数值为0表示存储的数据永远不过时(但是,该数据有可能被其他项所替换掉。因为服务器采用了LRU(最近最久没有使用)的算法替换)。 如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。


    e) <bytes> 需要存储的字节数(不包含最后的"\r\n"),当用户希望存储空数据时,<bytes>可以为0


    f) 最后客户端需要加上"\r\n"作为"命令头"的结束标志。


<data block>\r\n

    紧接着"命令头"结束之后就要发送数据块(即希望存储的数据内容),最后加上"\r\n"作为此次通讯的结束。


reply

    当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:


    a) "STORED\r\n"

        表示存储成功


    b) "NOT_STORED\r\n"

        表示存储失败,但是该失败不是由于错误。通常这是由于"add"或者"replace"命令本身的要求所引起的,或者该项在删除队列之中(见delete命令)。


set

set是保存数据命令。会覆盖已存在的数据,而新数据将在LRU顶端

add

只有在该数据不存在时才保存该数据。如果是新加入的item,那么将其直接放在LRU顶端;如果item已经存在导致add失败,那么将这个item从LRU链表上摘下再放到LRU顶端。

replace

替换已经存在的数据。 这个操作几乎用不到。

append

紧接着已经存在的item增加item。这个操作不允许增加原来的item限制,对管理链表很有用。

prepend

与append命令类似,这个命令是在已存在的数据前加入新数据。

cas

检查并存储(

Check And Set)或者比较并更新(Compare And Swap)。如果从上次读取到现在没有更新,那么存入数据,处理更新竞争很有用。

读取命令

获取数据的格式: 

get <key>*\r\n

    a) <key>* 表示一个或者多个key(以空格分开)

    b) "\r\n" 命令头的结束


reply

    服务器端将返回0个或者多个的数据项。每个数据项都是由一个文本行和一个数据块组成。当所有的数据项都接收完毕将收到"END\r\n"


每一项的数据结构:

VALUE <key> <flags> <bytes>\r\n

<data block>\r\n

    a) <key> 希望得到存储数据的key

    b) <falg> 发送set命令时设置的标志项

    c) <bytes> 发送数据块的长度(不包含"\r\n")

    d) "\r\n" 文本行的结束标志

    e) <data block> 希望接收的数据项。

    f) "\r\n" 接收一个数据项的结束标志。


如果有些key出现在get命令行中但是没有返回相应的数据,这意味着服务器中不存在这些项,这些项过时了,或者被删除了。

get

读取命令, 更具一个或多个key查找数据,并返回所找到的数据。

gets

使用CAS的get命令,返回的item带有一个CAS标识符 (一个唯一的64位数)。使用cas命令返回数据。如果得到的item的cas值被更改了,这个数据将不会被保存。


删除命令

如果存在,将item从cache中删除,

delete 命令格式: 

delete <key> <time>\r\n

   a) <key> 需要被删除数据的key

    b) <time> 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)

    c) "\r\n" 命令头的结束


reply


    a) "DELETED\r\n" 删除成功

    b) "NOT_FOUND\r\n" 需要删除的key不存在


incr/decr

Increment and Decrement. 如果item是以64为整型存储的,那么可以使用incr和decr命令修改那个数。

如果数据不存在,那么将返回失败。

命令格式:

incr <key> <value>\r\n

or

decr <key> <value>\r\n

    a) <key> 数据项的key

    b) <value> 用户希望增加/减少的数据的数值.该数值是一个32位十进制的无符号整形变量。

    c) "\r\n" 命令行结束标志


reply

    a) "NOT_FOUND\r\n" 没有找到需要操作的项。

    b) "<value>\r\n" <value>数据项有效期的最新剩余时间。


注意: 

    a) 如果一个数据项的有效期被设置为0,这时使用decr命令是无法减少数据。

    b) 如果要执行 incr key -1 的操作不会有什么问题,结果和你希望的一样。但是,执行decr -1时的结果一定会让你觉得很意外,因为它的结果无论key的数据是什么结果的都是0.原因是:在这两个命令的执行过程中都是吧-1当做一个无符号的整形 处理的。

    c) 执行decr命令时数据的长度不会随之而减小,而是在返回数据的后面填补空格。但是执行incr命令越界后会自动的增加数据的位数。


查看memcached使用状态

 通过这些命令可以查看memcached服务器的使用状态。

stats

查看memcached状态的基本命令,通过这个命令可以看到如下信息:

STAT pid 22459                             进程ID
STAT uptime 1027046                        服务器运行秒数
STAT time 1273043062                       服务器当前unix时间戳
STAT version 1.4.4                         服务器版本
STAT pointer_size 64                       操作系统字大小(这台服务器是64位的)
STAT rusage_user 0.040000                  进程累计用户时间
STAT rusage_system 0.260000                进程累计系统时间
STAT curr_connections 10                   当前打开连接数
STAT total_connections 82                  曾打开的连接总数
STAT connection_structures 13              服务器分配的连接结构数
STAT cmd_get 54                            执行get命令总数
STAT cmd_set 34                            执行set命令总数
STAT cmd_flush 3                           指向flush_all命令总数
STAT get_hits 9                            get命中次数
STAT get_misses 45                         get未命中次数
STAT delete_misses 5                       delete未命中次数
STAT delete_hits 1                         delete命中次数
STAT incr_misses 0                         incr未命中次数
STAT incr_hits 0                           incr命中次数
STAT decr_misses 0                         decr未命中次数
STAT decr_hits 0                           decr命中次数
STAT cas_misses 0   cas未命中次数
STAT cas_hits 0                            cas命中次数
STAT cas_badval 0                          使用擦拭次数
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 15785                      读取字节总数
STAT bytes_written 15222                   写入字节总数
STAT limit_maxbytes 1048576                分配的内存数(字节)
STAT accepting_conns 1                     目前接受的链接数
STAT listen_disabled_num 0                 
STAT threads 4                             线程数
STAT conn_yields 0
STAT bytes 0                               存储item字节数
STAT curr_items 0                          item个数
STAT total_items 34                        item总数
STAT evictions 0                           为获取空间删除item的总数


来自:http://hi.baidu.com/notesjava/blog/item/c82e52599b6eb4d09c8204b3.html


 


TAG:

 

评分:0

我来说两句

Open Toolbar