Memcached原理和使用详解.ppt

上传人:牧羊曲112 文档编号:6512417 上传时间:2023-11-08 格式:PPT 页数:40 大小:1.35MB
返回 下载 相关 举报
Memcached原理和使用详解.ppt_第1页
第1页 / 共40页
Memcached原理和使用详解.ppt_第2页
第2页 / 共40页
Memcached原理和使用详解.ppt_第3页
第3页 / 共40页
Memcached原理和使用详解.ppt_第4页
第4页 / 共40页
Memcached原理和使用详解.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《Memcached原理和使用详解.ppt》由会员分享,可在线阅读,更多相关《Memcached原理和使用详解.ppt(40页珍藏版)》请在三一办公上搜索。

1、Memcached 原理和使用详解,作者:heiyeluren(黑夜路人),2009-01,2,Memcached介绍Memcached安装和使用一些技巧Q&A,Tech Talk 目录索引,3,Memcached介绍:,什么是Memcached?Memcached是国外社区网站 LiveJournal 的开发团队开发的高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。LiveJournal 团队开发了包括 Memcached、MogileFS、Perlbal 等不错的开源项目。,4,Memcached介绍,M

2、emcached运行图,5,Memcached介绍,谁在用Memcached?国外 国内,6,Memcached介绍,与Memcached类似的还有什么?国外 Tokyo Cabinet:http:/(日本mixi.jp公司开发)国内MemcacheDB:http:/memcachedb.org(新浪开源Team开发)tmcache:http:/(偶开发的 _),7,Memcached介绍,Memcached的主要特点基于C/S架构,协议简单基于libevent的事件处理自主内存存储处理基于客户端的Memcached分布式,8,Memcached介绍,基于C/S架构,协议简单,9,Memcac

3、hed介绍,基于libevent的事件处理libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。包装的接口包括:poll、select(Windows)、epoll(Linux)、kqueue(BSD)、/dev/pool(Solaris)Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。libevent:http:/www.monkey.org/provos/libevent/,10,Memcached介绍,自主的内存存储处理

4、 数据存储方式:Slab Allocation 数据过期方式:Lazy Expiration+LRU,11,Memcached介绍,数据存储方式:Slab AllocationSlab Alloction 构造图,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。Slab Allocation的原理相当简单。将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合),12,Memcached介绍,数据存储方式:Slab AllocationSlab Classes 分配图,Page:分配给Slab的

5、内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。Chunk:用于缓存记录的内存空间。Slab Class:特定大小的chunk的组。memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。,13,Memcached介绍:,数据存储方式:Slab AllocationSlab Alloction 缺点,这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了

6、。,14,Memcached介绍:,数据过期方式 Lazy Expirationmemcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。LRUmemcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间

7、时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。,15,Memcached介绍:,基于客户端的Memcached分布式,16,Memcached介绍:,基于客户端的Memcached分布式,/按照Key值,获取一个服务器IDint getServerId(char*key,int serverTotal)int c,hash=0;while(c=*key+)hash+=c;return hash%serverTotal;/服务器列表node0=192.168.0.1:11211node1=192.168.0.2:11211node2=192.

8、168.0.3:11211/获取key是tokyo的节点ID(服务器ID)int id=getServerId(test,3);/得出的结果是1,那么对应的机器就是 nodeid=node1,17,Memcached介绍:,基于客户端的Memcached分布式 写入操作 读取操作,18,Memcached安装和使用:,Memcached 安装 Memcached 与 PHP 结合使用 Memcached 与 C/C+结合使用,19,Memcached安装和使用:,Memcached 安装,安装步骤:先安装 libevent 再安装 Memcached 主程序源码下载:(最新版)libevent

9、官网:http:/monkey.org/provos/libevent/,20,Memcached安装和使用:,Memcached 安装,安装 libevent#./configure-prefix=/usr#make#make install 安装 Memcached#./configure-prefix=/usr/local#make#make install,21,Memcached安装和使用:,Memcached 运行,试运行 Memcached#/usr/local/bin/memcached-u hualiangxie,22,Memcached安装和使用:,Memcached 运行

10、,查看Memcached 帮助信息#/usr/local/bin/memcached-h,23,Memcached安装和使用:,Memcached 运行,关注基本选项-p 监听的TCP端口(缺省:11211)-d 以守护进程方式运行Memcached-u 运行Memcached的账户,非root用户-m 最大的内存使用,单位是MB,缺省是 64 MB-c 软连接数量,缺省是 1024-v 输出警告和错误信息-vv 打印客户端的请求和返回信息-h 打印帮助信息-i 打印memcached和libevent的版权信息运行 Memcached目标:使用11211端口、hualiangxie用户、最大

11、占用512M内存、1024个软连接,输出客户端请求,以守护进程方式运行#/usr/local/bin/memcached-p 11211-d-u hualiangxie-m 512-c 1024-vvv,24,Memcached安装和使用:,Memcached 运行,检查是否正常启动#pa auxxww|grep memcached1001 4402 0.0 0.0 2296 900 pts/0 S+19:24 0:00/usr/local/bin/memcached-u hualiangxie root 4547 0.0 0.0 1892 668 pts/3 S+19:42 0:00 gre

12、p memcached#telnet localhost 11211Trying 127.0.0.1.Connected to localhost.Escape character is.statsSTAT pid 4402STAT uptime 1032STAT time 1231155683STAT pointer_size 32.END,25,Memcached安装和使用:,Memcached 基本协议,数据存取set key1 0 180 3abcSTOREDadd key1 0 180 3xyzNOT_STOREDget key1VALUE key1 0 3abcENDreplace

13、 key1 0 180 3xyzSTOREDget key1VALUE key1 0 3xyzENDdelete key1DELETED,数字加减set key2 0 180 41234STOREDincr key2 31237get key2VALUE key2 0 41237ENDdecr key2 11236get key2VALUE key2 0 41236END,26,Memcached安装和使用:,Memcached 和 PHP 结合使用,安装 PHP Memcache 扩展扩展官网:扩展下载:Memcache扩展安装:#/usr/local/php/bin/phpize#./co

14、nfigure-with-php-config=/usr/local/php/bin/php-config#make#make install配置#ls-l/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/memcache.so#vim/usr/local/php/lib/php.ini 新增配置内容:extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/extension=memcache.so检查安装结果#/usr/local/

15、php/bin/php-m#/usr/local/apache2/bin/apachectl restart,27,Memcached安装和使用:,Memcached 与 PHP 结合使用,PHP与Memcache结合测试代码connect(localhost,11211);/保存数据$mem-set(key1,This is first value,0,60);$val=$mem-get(key1);echo Get key1 value:.$val.;/替换数据$mem-replace(key1,This is replace value,0,60);$val=$mem-get(key1)

16、;echo Get key1 value:.$val.;/保存数组数据$arr=array(aaa,bbb,ccc,ddd);$mem-set(key2,$arr,0,60);$val2=$mem-get(key2);echo Get key2 value:;print_r($val2);echo;,/删除数据$mem-delete(key1);$val=$mem-get(key1);echo Get key1 value:.$val.;/清除所有数据$mem-flush();$val2=$mem-get(key2);echo Get key2 value:;print_r($val2);ec

17、ho;/关闭连接$mem-close();?,28,Memcached安装和使用:,Memcached 与 PHP 结合使用,PHP与Memcache分布式在一台或者多台机器启用一个或者多个进程,这里是在一台机器启用两个进程,使用两个端口:#/usr/local/bin/memcached-p 11211-d-u hualiangxie#/usr/local/bin/memcached-p 11212-d-u hualiangxie PHP 测试代码addServer(localhost,11211);$mem-addServer(localhost,11212);/保存数据$mem-set(

18、key1,This is first value,0,60);$val=$mem-get(key1);echo Get key1 value:.$val.;/保存数组数据$arr=array(aaa,bbb,ccc,ddd);$mem-set(key2,$arr,0,60);$val2=$mem-get(key2);echo Get key2 value:;print_r($val2);echo;,/删除数据$mem-delete(key1);$val=$mem-get(key1);echo Get key1 value:.$val.;/关闭连接$mem-close();?注意:实际上Key1

19、保存在11211端口机器,Key2保存在11212端口机器上,29,Memcached安装和使用:,Memcached 和 C/C+结合使用,安装 C/C+Memcached 客户端库:libmemcached开发库官网:http:/tangent.org/552/libmemcached.html开发库下载:libmemcached库安装:#cd libmemcached-0.25#./configure-prefix=/usr#make#make install检查安装结果#ls/usr/lib/libmemcache*/库文件#ls/usr/include/libmemcached/*/

20、头文件#ls/usr/bin/mem*/命令行工具参考 libmenmcached 开发示例代码#man libmemcached_examples,30,Memcached安装和使用:,Memcached 与 C/C+结合使用,C/C+与Memcached结合测试代码#include#include#include#include int main(int argc,char*argv)memcached_st*memc;memcached_return rc;memcached_server_st*servers;char value8191;/connect server memc=me

21、mcached_create(NULL);servers=memcached_server_list_append(NULL,localhost,11211,/Fetch data char return_keyMEMCACHED_MAX_KEY;size_t return_key_length;char*return_value;size_t return_value_length;char*keys=key1;size_t key_length=4;uint32_t flags;rc=memcached_mget(memc,keys,key_length,1);return_value=m

22、emcached_fetch(memc,return_key,31,Memcached安装和使用:,Memcached 与 C/C+结合使用,C/C+与Memcached结合测试结果编译执行以上代码:#gcc-o c_test1 c_test1.c-lmemcached#./c_test1输出结果:Save key:key1 data:This is c first value success.Fetch key:key1 data:This is c first valueDelete Key key1 success.,32,Memcached安装和使用:,Memcached 与 C/C+

23、结合使用,C/C+与Memcached分布式结合测试代码1#include#include#include#include int main(int argc,char*argv)memcached_st*memc;memcached_return rc;memcached_server_st*servers;char value8191;/connect multi server memc=memcached_create(NULL);servers=memcached_server_list_append(NULL,localhost,11211,/Save multi data size

24、_t i;char*keys=key1,key2,key3;size_t key_length=4,4,4;char*values=This is c first value,This is c second value,This is c third value;size_t val_length=21,22,21;for(i=0;i 3;i+)rc=memcached_set(memc,keysi,key_lengthi,valuesi,val_lengthi,(time_t)180,(uint32_t)0);if(rc=MEMCACHED_SUCCESS)printf(Save key:

25、%s data:%s success.n,keysi,valuesi);,33,Memcached安装和使用:,Memcached 与 C/C+结合使用,C/C+与Memcached分布式结合测试代码2/Fetch multi data char return_keyMEMCACHED_MAX_KEY;size_t return_key_length;char*return_value;size_t return_value_length;uint32_t flags;rc=memcached_mget(memc,keys,key_length,3);while(return_value=me

26、mcached_fetch(memc,return_key,/Delete multi data for(i=0;i 3;i+)rc=memcached_set(memc,keysi,key_lengthi,valuesi,val_lengthi,(time_t)180,(uint32_t)0);rc=memcached_delete(memc,keysi,key_lengthi,(time_t)0);if(rc=MEMCACHED_SUCCESS)printf(Delete%s successn,keysi,valuesi);/free memcached_free(memc);return

27、 0;,34,Memcached安装和使用:,Memcached 与 C/C+结合使用,C/C+与Memcached分布式结合测试结果编译执行以上代码:#gcc-o c_test2 c_test2.c-lmemcached#./c_test2输出结果:Save key:key1 data:This is c first value success.Save key:key2 data:This is c second value success.Save key:key3 data:This is c third value success.Fetch key:key1 data:This i

28、s c first valueFetch key:key2 data:This is c second valueFetch key:key3 data:This is c third valueDelete key1 successDelete key2 successDelete key3 success,35,一些经验和技巧:,Memcached一些特性和限制,在 Memcached 中可以保存的item数据量是没有限制的,只有内存足够 Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个Memcached进程 最大30天的数据过期时间,设置为永久的也会在这

29、个时间过期,常量REALTIME_MAXDELTA 60*60*24*30 控制 最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250 控制 单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576 进行控制,它是默认的slab大小 最大同时连接数是200,通过 conn_init()中的freetotal 进行控制,最大软连接数是1024,通过 settings.maxconns=1024 进行控制 跟空间占用相关的参数:settings.factor=1.25,settings.chunk_size=48,影响slab的

30、数据占用和步进方式,36,一些经验和技巧:,查看Memcached内部工作状态,访问Memcached:telnet 主机名 端口号查看总状态:stats查看某项状态:stats curr_connections,禁止LRU,有些情况下LRU机制反倒会造成麻烦。memcached启动时通过“-M”参数可以禁止LRU,如下所示:$memcached-M-m 1024启动时必须注意的是,小写的“-m”选项是用来指定最大内存大小的。不指定具体数值则使用默认值64MB。指定“-M”参数启动后,内存用尽时memcached会返回错误。话说回来,memcached毕竟不是存储器,而是缓存,所以推荐使用LR

31、U。,37,一些经验和技巧:,Memcached使用线程模式工作,在安装的时候必须打开:./configure-enable-threads安装完之后,启动的时候看看帮助信息有没有这条:-t number of threads to use,default 4如果存在该选项,说明已经支持了线程,就可以在启动的时候使用-t 选项来启动多线程然后启动的时候必须加上你需要支持的线程数量:/usr/local/memcache/bin/memcached-t 1024,38,一些经验和技巧:,调优Slab和内存分配1,memcached在启动时指定 Growth Factor因子(通过-f选项),就可

32、以在某种程度上控制slab之间的差异。默认值为1.25。但是,在该选项出现之前,这个因子曾经固定为2,称为“powers of 2”策略。让我们用以前的设置,以verbose模式启动memcached试试看:$memcached-f 2-vvslab class 1:chunk size 128 perslab 8192slab class 2:chunk size 256 perslab 4096slab class 3:chunk size 512 perslab 2048slab class 4:chunk size 1024 perslab 1024slab class 5:chunk

33、 size 2048 perslab 512slab class 6:chunk size 4096 perslab 256slab class 7:chunk size 8192 perslab 128slab class 8:chunk size 16384 perslab 64slab class 9:chunk size 32768 perslab 32slab class 10:chunk size 65536 perslab 16slab class 11:chunk size 131072 perslab 8slab class 12:chunk size 262144 pers

34、lab 4slab class 13:chunk size 524288 perslab 2,39,一些经验和技巧:,调优Slab和内存分配2,可见,从128字节的组开始,组的大小依次增大为原来的2倍。这样设置的问题是,slab之间的差别比较大,有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了growth factor这个选项。来看看现在的默认设置(f=1.25)时的输出(篇幅所限,这里只写到第10组):slab class 1:chunk size 88 perslab 11915slab class 2:chunk size 112 perslab 9362slab cla

35、ss 3:chunk size 144 perslab 7281slab class 4:chunk size 184 perslab 5698slab class 5:chunk size 232 perslab 4519slab class 6:chunk size 296 perslab 3542slab class 7:chunk size 376 perslab 2788slab class 8:chunk size 472 perslab 2221slab class 9:chunk size 592 perslab 1771slab class 10:chunk size 744 perslab 1409可见,组间差距比因子为2时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。将memcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,调整growth factor,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。,40,一些经验和技巧:,参考文档和延伸阅读,以下为本PPT参考文档,特别是参考了mixi.jp 公司编写的Memcached全面剖析Memcached全面剖析:http:/1.2 内存模型分析:http:/,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号