memcache 详解

memcached 相关命令

stats

STAT pid 2821                                    //memcached 进程ID

STAT uptime 1601                              //服务器运行时间(单位:秒)

STAT time 1418968920                       //服务器当前时间戳

STAT version 1.4.14 (Ubuntu)            // memcached 版本信息

STAT libevent 2.0.21-stable               // libevent 版本信息

STAT pointer_size 64                         //当前操作系统指针大小 32->32bit    64->64bit     

STAT rusage_user 0.052849              //进程的累积用户时间

STAT rusage_system 0.042096        //进程的累计系统时间

STAT curr_connections 5               //服务器当前存储的items数量

STAT total_connections 9            //服务器启动以后存储的items数量

STAT connection_structures 6     //服务器分配的连接构造数

STAT reserved_fds 20

STAT cmd_get 1                            //get 请求数

STAT cmd_set 0                           //set请求数

STAT cmd_flush 0                        //flush 请求数

STAT cmd_touch 0                  //touch 请求数量

STAT get_hits 0                       //总命中数

STAT get_misses 1                  未命中数

STAT delete_misses 0              delete未命中数

STAT delete_hits 0                   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 touch_hits 0                     touch命中数

STAT touch_misses 0                  touch未命中数

STAT auth_cmds 0                    认证命令处理的次数

STAT auth_errors 0                    认证失败的次数

STAT bytes_read 201                  总读取字节数(请求字节)

STAT bytes_written 138              总发送字节数(结果字节数)

STAT limit_maxbytes 67108864  分配给memcached的内存大小(字节)

STAT accepting_conns 1             服务器是否达到最大连接(0/1)

STAT listendisablednum 0

STAT threads 4                            线程数

STAT conn_yields 0

STAT hashpowerlevel 16

STAT hash_bytes 524288

STAT hashisexpanding 0

STAT expired_unfetched 0

STAT evicted_unfetched 0

STAT bytes 0             存储item字节数

STAT curr_items 0        item个数

STAT total_items 0      item总数

STAT evictions 0           未获取空间删除item总数

STAT reclaimed 0

END

默认情况下memcached安装到/usr/local/bin下。

进入安装目录,启动memcached:/usr/local/memcached/bin/memcached -d -c 10240 -m 1024 -u root

获取运行状态:echo stats | nc localhost 11211(可以查看出pid) 或使用ps -ef|grep memcached

停止memcached:kill -9 pid  (-9表示强制杀死,pid 为进程的进程标识符)

-d 选项是启动一个守护进程,

-m 是分配给Memcache使用的内存数量,单位是MB,这里是1024MB,默认是64MB

-u 是运行Memcache的用户,这里是root

-l 是监听的服务器IP地址,默认应该是本机

-p 是设置Memcache监听的端口,默认是11211,最好是1024以上的端口

-c 选项是最大运行的并发连接数,默认是1024,这里设置了10240,按照你服务器的负载量来设定

-P 是设置保存Memcache的pid文件位置

-h 打印帮助信息

-v 输出警告和错误信息

-vv 打印客户端的请求和返回信息

ps -ef|grep memcached(命令说明)

grep:功能说明:查找文件里符合条件的字符串。

|:管道命令操作符

ps(process status):功能说明:报告程序状况。

 

连接到 memcached:

telnet ip 端口,如telnet 192.168.100.11 11211

 

stats查看状态,flush_all:清楚缓存

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

连接

cmd下执行:

格式:telnet ip port,如下:

telnet 127.0.0.1 11211

如连接失败,显示

 

 

退出

quit

 

命令说明:

一、存储命令

存储命令的格式:

?

1

2

参数说明如下:

set/add/replace

查找关键字

整型参数,客户机使用它存储关于键值对的额外信息

该数据的存活时间(以秒为单位,表示永远) 

存储字节数

存储的数据块(可直接理解为key-value结构中的value

1、添加

(1)、无论如何都存储的set,如果setkey已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

set a 0 0 4

1234

回显:

STORED

可以通过“get key”的方式查看添加进去的记录:

get a

回显:

VALUE a 0 4

1234

END

 

(2)、只有数据不存在时进行添加的add

add b 0 0 3

123

STORED

如果key已经存在,则回显

NOT_STORED

 

(3)、只有数据存在时进行替换的replace

replace b 0 0 2

aa

STORED

如果key不存在,则回显

NOT_STORED

 

2、删除

命令:delete key

删除已存在的键值和不存在的记录可以返回不同的结果

delete c

NOT_FOUND

delete b

DELETED

 

3、修改

命令:delete key

删除已存在的键值和不存在的记录可以返回不同的结果

二、读取命令

1、get

get命令的key可以表示一个或者多个键,键之间以空格隔开

获取一个

get b

VALUE b 0 2

aa

END

获取多个

get a b

VALUE a 0 4

1234

VALUE b 0 2

aa

END

 

2、gets

gets命令比普通的get命令多返回了一个数字。这个数字可以检查数据是否发生改变。当key对应的数据改变时,这个多返回的数字也会改变。

get a

VALUE a 0 4

1234

END

gets a

VALUE a 0 4 2

1234

END

 

get b

VALUE b 0 2

aa

END

gets b

VALUE b 0 2 5

aa

END

 

3、cas

cas即checked and set的意思,只有当最后一个参数和gets所获取的参数匹配时才能存储,否则返回“EXISTS”。

gets a

VALUE a 0 4 2

1234

END

cas a 0 0 4 3

2154EXISTS        ——存储失败

get a

VALUE a 0 4

1234

END

cas a 0 0 4 2

4321

STORED        ——存储成功

gets a

VALUE a 0 4 6

4321

END

 

三、状态命令

1、stats  全局统计

 

可以计算缓存命中率

命中率=gethits / (gethits + get_misses)

get_hits表示命中次数

get_misses表示未命中次数

注意:这个命中率是从memcached启动开始所有的请求的综合值,不能反映一个时间段内的情况

 

2、stats items  统计各slab class中的item的情况

 

执行stats items,可以看到STAT items行,如果memcached存储内容很多,那么这里也会列出很多的STAT items行。

number 3 表示当前有3个值

age:反应了当前还在缓存的数据中最久的时间

evicted:如果一个slab的evicted属性不是0,则说明当前slab出现了提前剔除数据的情况,这个slab可能是你需要注意的。

evictedtime:如果evicted不为0,则evicitedtime就代表最后被剔除的数据时间缓存的时间。

3、stats slabs*  统计slabs的使用情况*

chunk_size    当前slab每个chunk的大小

chunkperpage     每个page能够存放的chunk数

total_pages  分配给当前slab的page总数

totalchunks 当前slab最多能够存放的chunk数,应该等于chunckperpage * totalpage

used_chunks 已经被占用的chunks总数

free_chunks  过期数据空出的chunk里还没有被使用的chunk数

freechunksend     新分配的但是还没有被使用的chunk数

 

这个命令的信息量很大,所有属性都很有价值。下面一一解释各属性:

chunksize, chunkper_page

这两个属性是固定的,但是它反映当前slab存储的数据大小,可以供你分析缓存数据的散列区间,通过调整增长因子可以改变slab的区间分布,从而改变数据散列到的区域。如果大量的230byte到260byte的数据,而刚好一个slab大小是250byte,则250byte到260byte的数据将被落到下一个slab,从而导致大量的空间浪费。

total_pages

这个是当前slab总共分配大的page总数,如果没有修改page的默认大小的情况下,这个数值就是当前slab能够缓存的数据的总大小(单位为M)。如果这个slab的剔除非常严重,一定要注意这个slab的page数是不是太少了。

我上次处理的那个项目因为和另外的一个项目共用的memcache,而且memcache已经运行了很长时间,导致page都已经全部被分配完,而刚好两个项目的缓存数据大小差别很多,导致新项目数据最多的slab 4竟然只有一个page,所以数据缓存不到22s就被替换了,完全失去了缓存的意义。

针对我遇到的那个情况,解决方案是重新分配page,或者重启memcache服务。但是page reassign方法从1.2.8版已经完全移除了,所以现在没有办法在线情况下重新分配page了。另外一种有些时候是不可以接受的,因为一次缓存服务器的重启将导致所有缓存的数据将重新从DB取出,这个可能造成db的压力瞬间增大。而且有的缓存数据时不入库的,这个时候我们就需要做memcache的导入和导出了。在下篇文章中我会总结下memcache的dump操作。

total_chunks

这个的作用和total_pages基本相同,不过这个属性可以更准确的反应实际可以存放的缓存对象总数。

usedchunks, freechunks, freechunksend

这三个属性相关度比较高,从数值上来看它们满足:

totalchunks = usedchunks + freechunks + freechunks_end

usedchunks就是字面的意思,已经使用的chunk数;freechunks却不是所有的未被使用的chunk数,而是曾经被使用过但是因为过期而被回收的chunk数;freechunksend是page中从来没有被使用过的chunk数。

 

3、stats cachedump slabid limitnum

我们执行stats cachedump 1 0 命令效果如下:

 

命令当中的1,即为  中的1,0表示全部取出,n表示取出n行

这里slabid为1,是由2中的stats items返回的结果(STAT items后面的数字)决定的;limitnum看起来好像是返回多少条记录,猜的一点不错, 不过0表示显示出所有记录,而n(n>0)就表示显示n条记录,如果n超过该slab下的所有记录,则结果和0返回的结果一致。

通过stats items、stats cachedump slabid limitnum配合get命令可以遍历memcached的记录。

 

4、其他stats命令

如stats slabs,stats sizes,stats reset等等使用也比较常见。

 

四、其他常见命令

1、append

在现有的缓存数据添加缓存数据,如现有缓存的key不存在服务器响应为NOT_STORED。

 

 

2、prepend

和append非常类似,但它的作用是在现有的缓存数据添加缓存数据。

 

 

3、flush_all []

该命令有一个可选的数字参数。它总是执行成功,服务器会发送 OK\r\n 回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。 flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行(这是由memcached的懒惰检测和删除机制决定的)。

这个最简单的命令仅用于清理缓存中的所有名称/值对。如果您需要将缓存重置到干净的状态,则flush_all 能提供很大的用处。

 

flushall 效果是它导致所有更新时间早于 flushall 所设定时间的项目,在被执行取回命令时命令被忽略。

 

4、incr/decr

对于存储为数字型(正值)的可以通过incr/decr命令进行增减操作。

 

这两个命令是原子操作

这两个操作的前提是这个key存在且其值是一个有效的64-bit无符号整数的十进制表示(在内部存储时,其实是用的字符串)

decr至0后,再decr不会有效果。但incr到最大值后会溢出

Hibbs

0