Memcached学习资料

回复 收藏
memcached
是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。官方站点 http://memcached.org/

memcached运行流程图
http://www.apelearn.com/bbs/data/attachment/forum/201509/29/133658rp89iiep8gwviyge.jpg
  
memcached特点
•基于C/S架构,协议简单
•基于libevent 的事件处理
•自主内存存储处理
存储方式为slab allocation   
Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。其结构图如下:
http://www.apelearn.com/bbs/data/attachment/forum/201509/29/133705ptdx9fu0pinnuf7u.jpg  

Growth Factor
memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制slab之间的差异,chunk大小的差异。默认值为1.25。
通过memcached-tool查看指定memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25
http://www.apelearn.com/bbs/data/attachment/forum/201509/29/133713g1eba6xerb3bza9e.jpg
  
Slab Allocation的缺点
Slab Allocation可以有效的解决内存碎片问题,但是在如下情况下,会导致内存的浪费:
每个slab的chunk大小是固定的,当item的占用空间实际小于chunk大小时,会出现内存浪费
每个slab的大小是固定的(因为page是固定的),当slab不能被他所拥有的chunk整除时,会出现内存浪费
按照Growth Factor因子生成指定大小的slab,而某slab id根本未被使用时,会出现内存浪费

通过memcache添加tem的时候
1.Memcache计算item的大小(key+value+flags),选取合适的slab(刚好能放下该item的slab)
2.如果这个item对应的slab未出现过,则申请1个page(注意,这1M空间不论是否达到memcached使用内存都可以申请成功)并加该item存入slab中的chunk
3.如果item对应的slab出现过,则在该slab中优先选择expired(free_chunks)和delete(在1.2.2中delete的chunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunk(free_chunks_end)进行存储。
4.如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page,这个page被分为对应大小的chunk,继续存储。
5. 如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)此时会有eviction++


数据过期方式
• Lazy Expiration
memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
• LRU
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

memcached安装和使用
yum install -y libevent  memcached  libmemcached

启动命令:
/etc/init.d/memcached start

查看进程
ps aux |grep memcached

默认监听127.0.0.1:11211,默认使用内存64M,这个数值可以调节
vim /etc/sysconfig/memcached
调整CACHESIZE


-d选项是启动一个守护进程
-m是分配给Memcache使用的内存数量,单位是MB,这里是200MB
-u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。
-l是监听的服务器IP地址
-p是设置Memcache监听的端口,默认是11211
-c选项是最大运行的并发连接数,默认是1024
-P是设置保存Memcache的pid文件


查看memcached运行状态
memcached-tool 127.0.0.1:11211  stats
或者echo stats |nc 127.0.0.1 11211  需要安装nc工具  yum install -y nc
若安装libmemcached后,可以使用命令
memstat --servers=127.0.0.1:11211 查看memcached服务状态

命令行用法:
telnet  127.0.0.1 11211
set key2 0 60 3
abc
STORED
get key2
VALUE key2 0 3
abc
END

语法规则  
\r\n \r\n
注:\r\n在windows下是Enter键
a)  可以是”set”, “add”, “replace”。
“set”表示按照相应的存储该数据,没有的时候增加,有的覆盖。
“add”表示按照相应的添加该数据,但是如果该已经存在则会操作失败。
“replace”表示按照相应的替换数据,但是如果该不存在则操作失败。
有时“add”,“replace”也会存储不上。
b)  客户端需要保存数据的key。
c)  是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
d)  过期的时间。
若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
e)  需要存储的字节数,当用户希望存储空数据时可以为0
f) 需要存储的内容,输入完成后,最后客户端需要加上”\r\n”(windows直接点击Enter)作为”命令头”的结束标志。
set key3 1 100 4
abcd
STORED
get key3
VALUE key3 1 4
abcd
END
replace key3 1 200 5
abcdx
STORED
get key3
VALUE key3 1 5
abcdx
END
delete key3
DELETED
get key3
END

参考资料
memcached常用命令   http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html

php连接使用memcached
首先需要安装php的memcache扩展
可以使用php自带的pecl安装程序
# /usr/local/php/bin/pecl install memcache
也可以从源码安装
# wget  http://www.lishiming.net/data/attachment/forum/memcache-2.2.3.tgz
# tar zxf memcache-2.2.3.tgz
# cd memcache-2.2.3
# /usr/local/php/bin/phpize
# ../configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/
把这个记住,然后修改php.ini,把
extension_dir = "./"
修改为
extension_dir = "/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/"
并添加一行
extension="memcache.so"
检验
# /usr/local/php/bin/php -m
测试php脚本
wget www.apelearn.com/study_v2/.memcache.txt

mv .memcache.txt   test.php
/usr/local/php/bin/php test.php

附件:http://www.apelearn.com/bbs/thread-8660-1-1.html


扩展学习
maget搭建memcached集群  http://blog.snsgou.com/post-800.html
memcached get all keys方法  http://www.aikaiyuan.com/6433.html




2015-11-12 13:21 举报
已邀请:
0

奋斗的种子

赞同来自:

0

杭州小白

赞同来自:

复习一下
0

starry

赞同来自:

stats cachedumps 也不能直接获得所有的key,只能获得指定 items_id(slab)中的所有keys

memcached-tool ip:port dump
可以直接获得所有的keys和values
0

prospect

赞同来自:

可以可以
0

zmh0415

赞同来自:

好,学习了!
0

xiaobai

赞同来自:

学习了···
0

pwq18627318744

赞同来自:

学习了
0

zmh0415

赞同来自:

学习了,很有帮助!

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: