《原理和使用详解》PPT课件

上传人:s9****2 文档编号:570883727 上传时间:2024-08-07 格式:PPT 页数:40 大小:1.36MB
返回 下载 相关 举报
《原理和使用详解》PPT课件_第1页
第1页 / 共40页
《原理和使用详解》PPT课件_第2页
第2页 / 共40页
《原理和使用详解》PPT课件_第3页
第3页 / 共40页
《原理和使用详解》PPT课件_第4页
第4页 / 共40页
《原理和使用详解》PPT课件_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《《原理和使用详解》PPT课件》由会员分享,可在线阅读,更多相关《《原理和使用详解》PPT课件(40页珍藏版)》请在金锄头文库上搜索。

1、MemcachedMemcached 原理和使用详解原理和使用详解作者:作者:heiyeluren(heiyeluren(黑夜路人黑夜路人) )2009-01 博客:http:/ lMemcachedMemcachedMemcachedMemcached介绍介绍介绍介绍l lMemcachedMemcachedMemcachedMemcached安装安装安装安装和使用和使用和使用和使用l l一些技巧一些技巧一些技巧一些技巧l lQ&AQ&AQ&AQ&ATech Talk 目录索引目录索引2MemcachedMemcached介绍介绍: :什么是什么是什么是什么是MemcachedMemcach

2、edMemcachedMemcached?MemcachedMemcachedMemcachedMemcached是国外是国外是国外是国外社区社区社区社区网站网站网站网站 LiveJournal LiveJournal LiveJournal LiveJournal 的开发团队开发的的开发团队开发的的开发团队开发的的开发团队开发的高性能的分布式内高性能的分布式内高性能的分布式内高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访

3、存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态问次数,以提高动态问次数,以提高动态问次数,以提高动态WebWebWebWeb应用的速度、提高可扩展性。应用的速度、提高可扩展性。应用的速度、提高可扩展性。应用的速度、提高可扩展性。LiveJournal LiveJournal 团队开发了包括团队开发了包括团队开发了包括团队开发了包括 Memcached Memcached、MogileFSMogileFS、Perlbal Perlbal 等不错的开等不错的开等不错的开等不错的开源项目。源项目。源项目。源项目。官方网站:官方网站:官方网站:官方网站:http

4、:/ 国内国内国内国内5MemcachedMemcached介绍介绍与与与与MemcachedMemcachedMemcachedMemcached类似的还有什么类似的还有什么类似的还有什么类似的还有什么?国外国外国外国外 Tokyo CabinetTokyo CabinetTokyo CabinetTokyo Cabinet:http:/ (http:/ (http:/ (http:/ (日本日本日本日本mixi.jpmixi.jpmixi.jpmixi.jp公司公司公司公司开发开发开发开发) ) ) )国内国内国内国内MemcacheDBMemcacheDBMemcacheDBMemcac

5、heDB:http:/memcachedb.org (http:/memcachedb.org (http:/memcachedb.org (http:/memcachedb.org (新浪开源新浪开源新浪开源新浪开源TeamTeamTeamTeam开发开发开发开发) ) ) )tmcache: tmcache: tmcache: tmcache: http:/ (http:/ (http:/ (http:/ (偶开发的偶开发的偶开发的偶开发的 _) _) _) _)6MemcachedMemcached介绍介绍MemcachedMemcachedMemcachedMemcached的主要特点

6、的主要特点的主要特点的主要特点 基于基于基于基于C/SC/SC/SC/S架构,架构,架构,架构,协议简单协议简单协议简单协议简单 基于基于基于基于libeventlibeventlibeventlibevent的事件处理的事件处理的事件处理的事件处理 自主内存存储处理自主内存存储处理自主内存存储处理自主内存存储处理 基于客户端的基于客户端的基于客户端的基于客户端的MemcachedMemcachedMemcachedMemcached分布式分布式分布式分布式7MemcachedMemcached介绍介绍基于基于基于基于C/SC/SC/SC/S架构,协议简单架构,协议简单架构,协议简单架构,协议

7、简单8MemcachedMemcached介绍介绍基于基于基于基于libeventlibeventlibeventlibevent的事件处理的事件处理的事件处理的事件处理libeventlibeventlibeventlibevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris Windows/Linux/BSD/Solaris Windows/Lin

8、ux/BSD/Solaris Windows/Linux/BSD/Solaris 等操作系统的的事件处理。等操作系统的的事件处理。等操作系统的的事件处理。等操作系统的的事件处理。包装的接口包括:包装的接口包括:包装的接口包括:包装的接口包括:pollpollpollpoll、select(Windows)select(Windows)select(Windows)select(Windows)、epoll(Linux)epoll(Linux)epoll(Linux)epoll(Linux)、kqueue(BSD)kqueue(BSD)kqueue(BSD)kqueue(BSD)、/dev/po

9、ol(Solaris)/dev/pool(Solaris)/dev/pool(Solaris)/dev/pool(Solaris)Memcached Memcached Memcached Memcached 使用使用使用使用libeventlibeventlibeventlibevent来进行网络并发连接的处理,能够保持在很大并发情来进行网络并发连接的处理,能够保持在很大并发情来进行网络并发连接的处理,能够保持在很大并发情来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。况下,仍旧能够保持快速的响应能力。况下,仍旧能够保持快速的响应能力。况下,仍旧能够保持快速的

10、响应能力。libevent: libevent: libevent: libevent: http:/www.monkey.org/provos/libevent/http:/www.monkey.org/provos/libevent/http:/www.monkey.org/provos/libevent/http:/www.monkey.org/provos/libevent/9MemcachedMemcached介绍介绍自主的内存存储处理自主的内存存储处理自主的内存存储处理自主的内存存储处理 数据数据数据数据存储方式:存储方式:存储方式:存储方式:Slab AllocationSlab

11、 AllocationSlab AllocationSlab Allocation 数据数据数据数据过期过期过期过期方式:方式:方式:方式:Lazy Expiration + LRULazy Expiration + LRULazy Expiration + LRULazy Expiration + LRU10MemcachedMemcached介绍介绍数据存储方式:数据存储方式:数据存储方式:数据存储方式:Slab AllocationSlab AllocationSlab AllocationSlab Allocation Slab Alloction Slab Alloction Sla

12、b Alloction Slab Alloction 构造图构造图构造图构造图Slab AllocatorSlab AllocatorSlab AllocatorSlab Allocator的基本原理是按照预先的基本原理是按照预先的基本原理是按照预先的基本原理是按照预先规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。Slab AllocationSlab Allocatio

13、nSlab AllocationSlab Allocation的原理相当简单。的原理相当简单。的原理相当简单。的原理相当简单。 将将将将分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块(chunkchunkchunkchunk),并把尺寸相同的块分成组),并把尺寸相同的块分成组),并把尺寸相同的块分成组),并把尺寸相同的块分成组(chunkchunkchunkchunk的集合)的集合)的集合)的集合)11MemcachedMemcached介绍介绍数据存储方式:数据存储方式:数据存储方式:数据存储方式:Slab Allocatio

14、nSlab AllocationSlab AllocationSlab Allocation Slab Slab Slab Slab Classes Classes Classes Classes 分配图分配图分配图分配图PagePagePagePage:分配给分配给分配给分配给SlabSlabSlabSlab的内存空间,默认是的内存空间,默认是的内存空间,默认是的内存空间,默认是1MB1MB1MB1MB。分配给。分配给。分配给。分配给SlabSlabSlabSlab之后根据之后根据之后根据之后根据slabslabslabslab的大小的大小的大小的大小切分成切分成切分成切分成chunkchu

15、nkchunkchunk。ChunkChunkChunkChunk:用于缓存记录的内存空间。用于缓存记录的内存空间。用于缓存记录的内存空间。用于缓存记录的内存空间。Slab ClassSlab ClassSlab ClassSlab Class:特定大小的特定大小的特定大小的特定大小的chunkchunkchunkchunk的组。的组。的组。的组。memcachedmemcachedmemcachedmemcached根据收到的数据的大小,选根据收到的数据的大小,选根据收到的数据的大小,选根据收到的数据的大小,选择最适合数据大小的择最适合数据大小的择最适合数据大小的择最适合数据大小的slabs

16、labslabslab。 memcachedmemcachedmemcachedmemcached中保存着中保存着中保存着中保存着slabslabslabslab内空闲内空闲内空闲内空闲chunkchunkchunkchunk的的的的列表,根据该列表选择列表,根据该列表选择列表,根据该列表选择列表,根据该列表选择chunkchunkchunkchunk,然后将,然后将,然后将,然后将数据缓存于其中。数据缓存于其中。数据缓存于其中。数据缓存于其中。12MemcachedMemcached介绍介绍: :数据存储方式:数据存储方式:数据存储方式:数据存储方式:Slab AllocationSlab

17、AllocationSlab AllocationSlab Allocation Slab Alloction Slab Alloction Slab Alloction Slab Alloction 缺点缺点缺点缺点这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将配的内存。例如,将配的内存。例如,将配的内存。例如,将100100100100字节的数据缓存到字节的数据缓存到字节的数据缓存

18、到字节的数据缓存到128128128128字节的字节的字节的字节的chunkchunkchunkchunk中,剩余中,剩余中,剩余中,剩余的的的的28282828字节就浪费了。字节就浪费了。字节就浪费了。字节就浪费了。13MemcachedMemcached介绍介绍: :数据过期方式数据过期方式数据过期方式数据过期方式 Lazy ExpirationLazy ExpirationLazy ExpirationLazy Expirationmemcachedmemcachedmemcachedmemcached内部不会监视记录是否过期,而是在内部不会监视记录是否过期,而是在内部不会监视记录是否过

19、期,而是在内部不会监视记录是否过期,而是在getgetgetget时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过期。这种技术被称为期。这种技术被称为期。这种技术被称为期。这种技术被称为lazylazylazylazy(惰性)(惰性)(惰性)(惰性)expirationexpirationexpirationexpiration。因此,。因此,。因此,。因此,memcachedmemcachedmemcachedmemcached不会在过期监视上耗费不会在过期监视上耗费不会在过期监视上耗费不会在过期监视上耗

20、费CPUCPUCPUCPU时间。时间。时间。时间。 LRULRULRULRUmemcachedmemcachedmemcachedmemcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为足的情况,此时就要使用名为足的情况,此时就要使用名为足的情况,此时就要使用名为 Least Recently Used Least Recently Us

21、ed Least Recently Used Least Recently Used(LRULRULRULRU)机制来分配空间。顾名思义,)机制来分配空间。顾名思义,)机制来分配空间。顾名思义,)机制来分配空间。顾名思义,这是删除这是删除这是删除这是删除“最近最少使用最近最少使用最近最少使用最近最少使用”的记录的机制。因此,当的记录的机制。因此,当的记录的机制。因此,当的记录的机制。因此,当memcachedmemcachedmemcachedmemcached的内存空间不足时(无法的内存空间不足时(无法的内存空间不足时(无法的内存空间不足时(无法从从从从slab class slab cla

22、ss slab class slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。给新的记录。从缓存的实用角度来看,该模型十分理想。给新的记录。从缓存的实用角度来看,该模型十分理想。给新的记录。从缓存的实用角度来看,该模型十分理想。14MemcachedMemcached介绍介绍: :基于客户端的基于客户端的基于客户端的基于

23、客户端的MemcachedMemcachedMemcachedMemcached分布式分布式分布式分布式15MemcachedMemcached介绍介绍: :基于客户端的基于客户端的基于客户端的基于客户端的MemcachedMemcachedMemcachedMemcached分布式分布式分布式分布式/按照按照按照按照KeyKeyKeyKey值,获取一个服务器值,获取一个服务器值,获取一个服务器值,获取一个服务器IDIDIDIDint int int int getServergetServergetServergetServerIdIdIdId(char *key, int serverTo

24、tal) (char *key, int serverTotal) (char *key, int serverTotal) (char *key, int serverTotal) int c, int c, int c, int c, hash = 0;hash = 0;hash = 0;hash = 0; while (c = *key+) while (c = *key+) while (c = *key+) while (c = *key+) hash += c;hash += c;hash += c;hash += c; return hash % serverTotal;retu

25、rn hash % serverTotal;return hash % serverTotal;return hash % serverTotal; /服务器列表服务器列表服务器列表服务器列表node0 = 192.168.0.1:11211node0 = 192.168.0.1:11211node0 = 192.168.0.1:11211node0 = 192.168.0.1:11211node1 = 192.168.0.2:11211node1 = 192.168.0.2:11211node1 = 192.168.0.2:11211node1 = 192.168.0.2:11211node

26、2 = 192.168.0.3:11211node2 = 192.168.0.3:11211node2 = 192.168.0.3:11211node2 = 192.168.0.3:11211/获取获取获取获取keykeykeykey是是是是tokyotokyotokyotokyo的节点的节点的节点的节点ID(ID(ID(ID(服务器服务器服务器服务器ID)ID)ID)ID)int id = int id = int id = int id = getServerId(getServerId(getServerId(getServerId(testtesttesttest, , , , 3 3

27、 3 3););););/得出的结果是得出的结果是得出的结果是得出的结果是1 1 1 1,那么对应的机器就是,那么对应的机器就是,那么对应的机器就是,那么对应的机器就是 nodeid = nodeid = nodeid = nodeid = nodenodenodenode1 1 1 1 16MemcachedMemcached介绍介绍: :基于客户端的基于客户端的基于客户端的基于客户端的MemcachedMemcachedMemcachedMemcached分布式分布式分布式分布式 写入操作写入操作写入操作写入操作 读取操作读取操作读取操作读取操作17MemcachedMemcached安装

28、和使用安装和使用: : Memcached Memcached Memcached Memcached 安装安装安装安装 Memcached Memcached Memcached Memcached 与与与与 PHP PHP PHP PHP 结合使用结合使用结合使用结合使用 Memcached Memcached Memcached Memcached 与与与与 C/C+ C/C+ C/C+ C/C+ 结合使用结合使用结合使用结合使用18MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 安装安装安装安

29、装安装步骤:安装步骤:安装步骤:安装步骤: 先安装先安装先安装先安装 libevent libevent 再安装再安装再安装再安装 Memcached Memcached 主程序主程序主程序主程序源码下载:源码下载:源码下载:源码下载:( (最新版最新版最新版最新版) )libeventlibevent官网:官网:官网:官网:http:/monkey.org/provos/libevent/http:/monkey.org/provos/libevent/libeventlibevent下载:下载:下载:下载:http:/monkey.org/provos/libevent-1.4.9-sta

30、ble.tar.gzhttp:/monkey.org/provos/libevent-1.4.9-stable.tar.gzMemcachedMemcached官网:官网:官网:官网:http:/ :Memcached Memcached Memcached Memcached 安装安装安装安装 安装安装安装安装 libevent libevent# # tar zxvf libevent-1.4.9-stable.tar.gztar zxvf libevent-1.4.9-stable.tar.gz# # cd libevent-1.4.9-stablecd libevent-1.4.9-s

31、table# ./configure -prefix=/usr# ./configure -prefix=/usr# # makemake# # make installmake install 安装安装安装安装 Memcached Memcached# # tar zxvf memcached-1.2.6.tar.gztar zxvf memcached-1.2.6.tar.gz# # cd memcached-1.2.6cd memcached-1.2.6# # ./configure -prefix=/usr/local./configure -prefix=/usr/local# ma

32、ke# make# make install# make install20MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 运行运行运行运行 试试试试运行运行运行运行 Memcached Memcached# /usr/local/bin/memcached -u hualiangxie# /usr/local/bin/memcached -u hualiangxie21MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memca

33、ched 运行运行运行运行查看查看查看查看Memcached Memcached 帮助信息帮助信息帮助信息帮助信息# /usr/local/bin/memcached# /usr/local/bin/memcached -h -h22MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 运行运行运行运行关注基本选项关注基本选项关注基本选项关注基本选项-p -p 监听的监听的TCPTCP端口端口 ( (缺省缺省: 11211): 11211)-d -d 以守护进程方式运行以守护进程方式运行MemcachedM

34、emcached-u -u 运行运行MemcachedMemcached的账户,非的账户,非rootroot用户用户-m -m 最大的内存使用最大的内存使用, , 单位是单位是MBMB,缺省是缺省是 64 MB 64 MB-c -c 软连接数量软连接数量, , 缺省是缺省是 1024 1024-v -v 输出警告和错误信息输出警告和错误信息-vv -vv 打印客户端的请求和返回信息打印客户端的请求和返回信息-h -h 打印帮助信息打印帮助信息-i -i 打印打印memcachedmemcached和和libeventlibevent的版权信息的版权信息运行运行运行运行 Memcached Me

35、mcached目标:使用目标:使用1121111211端口、端口、hualiangxiehualiangxie用户、最大占用用户、最大占用512M512M内存、内存、10241024个软连接,输出客个软连接,输出客户端请求,以守护进程方式运行户端请求,以守护进程方式运行# /usr/local/bin/memcached -p 11211 -d -u hualiangxie -m 512 -c 1024 -vvv# /usr/local/bin/memcached -p 11211 -d -u hualiangxie -m 512 -c 1024 -vvv23MemcachedMemcache

36、d安装和使用安装和使用: :Memcached Memcached Memcached Memcached 运行运行运行运行检查是否正常启动检查是否正常启动检查是否正常启动检查是否正常启动# # pa auxxww | grep memcachedpa auxxww | grep memcached1001 4402 0.0 0.0 2296 900 pts/0 S+ 19:24 0:00 /usr/local/bin/memcached -u hualiangxie1001 4402 0.0 0.0 2296 900 pts/0 S+ 19:24 0:00 /usr/local/bin/me

37、mcached -u hualiangxie root 4547 0.0 0.0 1892 668 pts/3 S+ 19:42 0:00 grep memcachedroot 4547 0.0 0.0 1892 668 pts/3 S+ 19:42 0:00 grep memcached# # telnet localhost 11211telnet localhost 11211Trying 127.0.0.1.Trying 127.0.0.1.Connected to localhost.Connected to localhost.Escape character is .Escape

38、 character is .statsstatsSTAT pid 4402STAT pid 4402STAT uptime 1032STAT uptime 1032STAT time 1231155683STAT time 1231155683STAT version 1.2.6STAT version 1.2.6STAT pointer_size 32STAT pointer_size 32.ENDEND24MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 基本协议基本协议基本协议基本协议数据数据数

39、据数据存取存取存取存取set key1 0 180 3set key1 0 180 3abcabcSTOREDSTOREDadd key1 0 180 3add key1 0 180 3xyzxyzNOT_STOREDNOT_STOREDget key1get key1VALUE key1 0 3VALUE key1 0 3abcabcENDENDreplace key1 0 180 3replace key1 0 180 3xyzxyzSTOREDSTOREDget key1get key1VALUE key1 0 3VALUE key1 0 3xyzxyzENDENDdelete key1

40、delete key1DELETEDDELETED数字加减数字加减数字加减数字加减set key2 0 180 4set key2 0 180 412341234STOREDSTOREDincr key2 3incr key2 312371237get key2get key2VALUE key2 0 4VALUE key2 0 412371237ENDENDdecr key2 1decr key2 112361236get key2get key2VALUE key2 0 4VALUE key2 0 412361236ENDEND25MemcachedMemcached安装和使用安装和使用:

41、 :MemcachedMemcachedMemcachedMemcached 和和和和 PHP PHP PHP PHP 结合使用结合使用结合使用结合使用安装安装安装安装 PHP Memcache PHP Memcache 扩展扩展扩展扩展扩展扩展官网:官网:http:/ # tar zxvf memcache-2.2.4.tgztar zxvf memcache-2.2.4.tgz# # cd memcache-2.2.4cd memcache-2.2.4# # /usr/local/php/bin/phpize/usr/local/php/bin/phpize# # ./configure

42、-with-php-config=/usr/local/php/bin/php-config./configure -with-php-config=/usr/local/php/bin/php-config# # makemake# # make installmake install配置配置配置配置# # ls -l /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/memcache.sols -l /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/m

43、emcache.so# # vim /usr/local/php/lib/php.ini vim /usr/local/php/lib/php.ini 新增配置内容:新增配置内容:extension_dir = /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/extension_dir = /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/extension = memcache.soextension = memcache.so检查安装结果检查安装结果

44、检查安装结果检查安装结果# # /usr/local/php/bin/php -m/usr/local/php/bin/php -m# # /usr/local/apache2/bin/apachectl restart/usr/local/apache2/bin/apachectl restart26MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 与与与与 PHP PHP PHP PHP 结合使用结合使用结合使用结合使用PHPPHP与与与与MemcacheMemcache结合测试代码结合测试代码结合

45、测试代码结合测试代码?phpconnect(localhost, 11211);$mem-connect(localhost, 11211);/ /保存数据保存数据$mem-set(key1, This is first value, 0, 60);$mem-set(key1, This is first value, 0, 60);$val = $mem-get(key1);$val = $mem-get(key1);echo Get key1 value: . $val .;echo Get key1 value: . $val .;/ /替换数据替换数据$mem-replace(key1

46、, This is replace value, 0, 60);$mem-replace(key1, This is replace value, 0, 60);$val = $mem-get(key1);$val = $mem-get(key1);echo Get key1 value: . $val . ;echo Get key1 value: . $val . ;/ /保存数组数据保存数组数据$arr = array(aaa, bbb, ccc, ddd);$arr = array(aaa, bbb, ccc, ddd);$mem-set(key2, $arr, 0, 60);$mem

47、-set(key2, $arr, 0, 60);$val2 = $mem-get(key2);$val2 = $mem-get(key2);echo Get key2 value: ;echo Get key2 value: ;print_r($val2);print_r($val2);echo ;echo ;/ /删除数据删除数据$mem-delete(key1);$mem-delete(key1);$val = $mem-get(key1);$val = $mem-get(key1);echo Get key1 value: . $val . ;echo Get key1 value: .

48、 $val . ;/ /清除所有数据清除所有数据$mem-flush();$mem-flush();$val2 = $mem-get(key2);$val2 = $mem-get(key2);echo Get key2 value: ;echo Get key2 value: ;print_r($val2);print_r($val2);echo ;echo ;/ /关闭连接关闭连接$mem-close();$mem-close();?27MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 与与与与 PH

49、P PHP PHP PHP 结合使用结合使用结合使用结合使用PHPPHP与与与与MemcacheMemcache分布式分布式分布式分布式在一台或者多台机器启用一个或者多个进程,这里是在一台机器启在一台或者多台机器启用一个或者多个进程,这里是在一台机器启用两个进程,使用两个端口:用两个进程,使用两个端口:# # /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie # # /usr/local/bin/memcached -p 1121/usr

50、/local/bin/memcached -p 11212 2 -d -u hualiangxie -d -u hualiangxie PHP PHP 测试代码测试代码测试代码测试代码?phpaddServer(localhost, 11211);$mem-addServer(localhost, 11211);$mem-addServer(localhost, 11212);$mem-addServer(localhost, 11212);/ /保存数据保存数据$mem-set(key1, This is first value, 0, 60);$mem-set(key1, This is

51、first value, 0, 60);$val = $mem-get(key1);$val = $mem-get(key1);echo Get key1 value: . $val .;echo Get key1 value: . $val .;/ /保存数组数据保存数组数据$arr = array(aaa, bbb, ccc, ddd);$arr = array(aaa, bbb, ccc, ddd);$mem-set(key2, $arr, 0, 60);$mem-set(key2, $arr, 0, 60);$val2 = $mem-get(key2);$val2 = $mem-get

52、(key2);echo Get key2 value: ;echo Get key2 value: ;print_r($val2);print_r($val2);echo ;echo ;/ /删除数据删除数据$mem-delete(key1);$mem-delete(key1);$val = $mem-get(key1);$val = $mem-get(key1);echo Get key1 value: . $val . ;echo Get key1 value: . $val . ;/ /关闭连接关闭连接$mem-close();$mem-close();?注意:注意:实际上实际上Key1

53、Key1保存在保存在1121111211 端口机器,端口机器,Key2Key2保存在保存在1121211212端口机器上端口机器上28MemcachedMemcached安装和使用安装和使用: :MemcachedMemcachedMemcachedMemcached 和和和和 C/ C/ C/ C/C+C+C+C+ 结合使用结合使用结合使用结合使用安装安装安装安装 C/ C/C+ Memcached C+ Memcached 客户端库:客户端库:客户端库:客户端库:libmemcachedlibmemcached开发库开发库官网:官网:http:/tangent.org/552/libmem

54、cached.htmlhttp:/tangent.org/552/libmemcached.html开发库开发库下载:下载:http:/download.tangent.org/libmemcached-0.25.tar.gzhttp:/download.tangent.org/libmemcached-0.25.tar.gzliblibmmemcachedemcached库库安装:安装:# # tar zxvf libmemcached-0.25.tar.gztar zxvf libmemcached-0.25.tar.gz# # cd libmemcached-0.25cd libmemc

55、ached-0.25# # ./configure -prefix=/usr./configure -prefix=/usr# # makemake# # make installmake install检查安装结果检查安装结果检查安装结果检查安装结果# # ls /usr/lib/libmemcache* /ls /usr/lib/libmemcache* /库文件库文件# # ls /usr/include/libmemcached/* /ls /usr/include/libmemcached/* /头文件头文件# # ls /usr/bin/mem* /ls /usr/bin/mem*

56、 /命令行工具命令行工具参考参考参考参考 libmenmcached libmenmcached 开发示例代码开发示例代码开发示例代码开发示例代码# man # man libmemcached_exampleslibmemcached_examples29MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 与与与与 C/C+C/C+C/C+C/C+ 结合使用结合使用结合使用结合使用C/C+C/C+与与与与MemcachedMemcached结合测试代码结合测试代码结合测试代码结合测试代码#include

57、 #include #include #include #include #include #include #include int main(int argc, char *argv) int main(int argc, char *argv) memcached_st *memc; memcached_st *memc; memcached_return rc; memcached_return rc; memcached_server_st *servers; memcached_server_st *servers; char value8191; char value8191;

58、/connect server /connect server memc = memcached_create(NULL); memc = memcached_create(NULL); servers = memcached_server_list_append(NULL, localhost, servers = memcached_server_list_append(NULL, localhost, 11211, &rc);11211, &rc); rc = memcached_server_push(memc, servers); rc = memcached_server_push

59、(memc, servers); memcached_server_free(servers); memcached_server_free(servers); /Save data /Save data strcpy(value, This is c first value); strcpy(value, This is c first value); rc = memcached_set(memc, key1, 4, value, strlen(value), rc = memcached_set(memc, key1, 4, value, strlen(value), (time_t)1

60、80, (uint32_t)0);(time_t)180, (uint32_t)0); if (rc = MEMCACHED_SUCCESS) if (rc = MEMCACHED_SUCCESS) printf(Save key:key1 data:%s success.n, value); printf(Save key:key1 data:%s success.n, value); /Fetch data /Fetch data char return_keyMEMCACHED_MAX_KEY; char return_keyMEMCACHED_MAX_KEY; size_t retur

61、n_key_length; size_t return_key_length; char *return_value; char *return_value; size_t return_value_length; size_t return_value_length; char *keys= key1; char *keys= key1; size_t key_length= 4; size_t key_length= 4; uint32_t flags; uint32_t flags; rc = memcached_mget(memc, keys, key_length, 1); rc =

62、 memcached_mget(memc, keys, key_length, 1); return_value = memcached_fetch(memc, return_key, return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc);&return_key_length, &return_value_length, &flags, &rc); if (rc = MEMCACHED_SUCCESS) if (rc = MEMCACHED_

63、SUCCESS) printf(Fetch key:%s data:%sn, return_key, return_value); printf(Fetch key:%s data:%sn, return_key, return_value); /Delete data /Delete data rc = memcached_delete(memc, key1, 4, (time_t)0); rc = memcached_delete(memc, key1, 4, (time_t)0); if (rc = MEMCACHED_SUCCESS) if (rc = MEMCACHED_SUCCES

64、S) printf(Delete Key key1 success.n); printf(Delete Key key1 success.n); /free /free memcached_free(memc); memcached_free(memc); return 0; return 0; 30MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 与与与与 C/C+C/C+C/C+C/C+ 结合使用结合使用结合使用结合使用C/C+C/C+与与与与MemcachedMemcached结合测试结合测试结合

65、测试结合测试结果结果结果结果编译执行以上代码:编译执行以上代码:编译执行以上代码:编译执行以上代码:# # gcc -o c_test1 c_test1.c -lmemcachedgcc -o c_test1 c_test1.c -lmemcached# # ./c_test1 ./c_test1输出结果:输出结果:输出结果:输出结果:Save key:key1 data:This is c first value success.Save key:key1 data:This is c first value success.Fetch key:key1 data:This is c fir

66、st valueFetch key:key1 data:This is c first valueDelete Key key1 success.Delete Key key1 success.31MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 与与与与 C/C+C/C+C/C+C/C+ 结合使用结合使用结合使用结合使用C/C+C/C+与与与与MemcachedMemcached分布式结合测试代码分布式结合测试代码分布式结合测试代码分布式结合测试代码1 1#include #include #incl

67、ude #include #include #include #include #include int main(int argc, char *argv) int main(int argc, char *argv) memcached_st *memc; memcached_st *memc; memcached_return rc; memcached_return rc; memcached_server_st *servers; memcached_server_st *servers; char value8191; char value8191; /connect multi

68、server /connect multi server memc = memcached_create(NULL); memc = memcached_create(NULL); servers = memcached_server_list_append(NULL, localhost, 11211, &rc); servers = memcached_server_list_append(NULL, localhost, 11211, &rc); servers = memcached_server_list_append(servers, localhost, 11212, serve

69、rs = memcached_server_list_append(servers, localhost, 11212, &rc);&rc); rc = memcached_server_push(memc, servers); rc = memcached_server_push(memc, servers); memcached_server_free(servers); memcached_server_free(servers); /Save multi data/Save multi data size_t i; size_t i; char *keys= key1, key2, k

70、ey3; char *keys= key1, key2, key3; size_t key_length= 4, 4, 4; size_t key_length= 4, 4, 4; char *values = This is c first value, This is c char *values = This is c first value, This is c second value, This is c third value;second value, This is c third value; size_t val_length= 21, 22, 21; size_t va

71、l_length= 21, 22, 21; for (i=0; i 3; i+) for (i=0; i 3; i+) rc = memcached_set(memc, keysi, rc = memcached_set(memc, keysi, key_lengthi, valuesi, val_lengthi, (time_t)180, key_lengthi, valuesi, val_lengthi, (time_t)180, (uint32_t)0);(uint32_t)0); if (rc = MEMCACHED_SUCCESS) if (rc = MEMCACHED_SUCCES

72、S) printf(Save key:%s data:%s success.n, printf(Save key:%s data:%s success.n, keysi, valuesi);keysi, valuesi); 32MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 与与与与 C/C+C/C+C/C+C/C+ 结合使用结合使用结合使用结合使用C/C+C/C+与与与与MemcachedMemcached分布式结合测试代码分布式结合测试代码分布式结合测试代码分布式结合测试代码2 2 /Fetch

73、multi data /Fetch multi data char return_keyMEMCACHED_MAX_KEY; char return_keyMEMCACHED_MAX_KEY; size_t return_key_length; size_t return_key_length; char *return_value; char *return_value; size_t return_value_length; size_t return_value_length; uint32_t flags; uint32_t flags; rc = memcached_mget(mem

74、c, keys, key_length, 3); rc = memcached_mget(memc, keys, key_length, 3); while (return_value = memcached_fetch(memc, return_key, while (return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc) &return_key_length, &return_value_length, &flags, &rc) if (r

75、c = MEMCACHED_SUCCESS) if (rc = MEMCACHED_SUCCESS) printf(Fetch key:%s data:%sn, return_key, return_value); printf(Fetch key:%s data:%sn, return_key, return_value); /Delete multi data /Delete multi data for (i=0; i 3; i+) for (i=0; i 3; i+) rc = memcached_set(memc, keysi, key_lengthi, rc = memcached

76、_set(memc, keysi, key_lengthi, valuesi, val_lengthi, (time_t)180, (uint32_t)0);valuesi, val_lengthi, (time_t)180, (uint32_t)0); rc = memcached_delete(memc, keysi, rc = memcached_delete(memc, keysi, key_lengthi, (time_t)0);key_lengthi, (time_t)0); if (rc = MEMCACHED_SUCCESS) if (rc = MEMCACHED_SUCCES

77、S) printf(Delete %s successn, keysi, valuesi); printf(Delete %s successn, keysi, valuesi); /free /free memcached_free(memc); memcached_free(memc); return 0; return 0; 33MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 与与与与 C/C+C/C+C/C+C/C+ 结合使用结合使用结合使用结合使用C/C+C/C+与与与与MemcachedM

78、emcached分布式结合测试分布式结合测试分布式结合测试分布式结合测试结果结果结果结果编译执行以上代码:编译执行以上代码:编译执行以上代码:编译执行以上代码:# # gcc -o c_testgcc -o c_test2 2 c_test c_test2 2.c -lmemcached.c -lmemcached# # ./c_test ./c_test2 2输出结果:输出结果:输出结果:输出结果:Save key:key1 data:This is c first value success.Save key:key1 data:This is c first value success.

79、Save key:key2 data:This is c second value success.Save key:key2 data:This is c second value success.Save key:key3 data:This is c third value success.Save key:key3 data:This is c third value success.Fetch key:key1 data:This is c first valueFetch key:key1 data:This is c first valueFetch key:key2 data:

80、This is c second valueFetch key:key2 data:This is c second valueFetch key:key3 data:This is c third valueFetch key:key3 data:This is c third valueDelete key1 successDelete key1 successDelete key2 successDelete key2 successDelete key3 successDelete key3 success34一些经验和技巧一些经验和技巧: :MemcachedMemcachedMem

81、cachedMemcached一些特性和限制一些特性和限制一些特性和限制一些特性和限制 在在 Memcached Memcached 中可以保存的中可以保存的itemitem数据量是没有限制的,只有内存足够数据量是没有限制的,只有内存足够 Memcached Memcached单进程最大使用内存为单进程最大使用内存为2G2G,要使用更多内存,可以分多个端口开启多个,要使用更多内存,可以分多个端口开启多个MemcachedMemcached进程进程 最大最大3030天的数据过期时间天的数据过期时间, , 设置为永久的也会在这个时间过期,常量设置为永久的也会在这个时间过期,常量REALTIME_M

82、AXDELTA REALTIME_MAXDELTA 60*60*24*30 60*60*24*30 控制控制 最大键长为最大键长为250250字节,大于该长度无法存储,常量字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250 KEY_MAX_LENGTH 250 控制控制 单个单个itemitem最大数据是最大数据是1MB1MB,超过,超过1MB1MB数据不予存储,常量数据不予存储,常量POWER_BLOCK 1048576 POWER_BLOCK 1048576 进行控制,进行控制, 它是默认的它是默认的slabslab大小大小 最大同时连接数是最大同时连接数是200200,通

83、过,通过 conn_init() conn_init()中的中的freetotal freetotal 进行控制,最大软连接数是进行控制,最大软连接数是10241024,通过,通过 settings.maxconns=1024 settings.maxconns=1024 进行控制进行控制 跟空间占用相关的参数:跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, settings.factor=1.25, settings.chunk_size=48, 影响影响slabslab的数据占用和步进方式的数据占用和步进方式35一些经验和技

84、巧一些经验和技巧: :查看查看查看查看MemcachedMemcachedMemcachedMemcached内部工作状态内部工作状态内部工作状态内部工作状态访问访问MemcachedMemcached:telnet telnet 主机名主机名 端口号端口号查看总状态:查看总状态:statsstats查看某项状态:查看某项状态:stats curr_connectionsstats curr_connections 禁止禁止禁止禁止LRULRULRULRU有些情况下有些情况下LRULRU机制反倒会造成麻烦。机制反倒会造成麻烦。memcachedmemcached启动时通过启动时通过“-M”“-

85、M”参数可以禁止参数可以禁止LRULRU,如下所示:,如下所示:$ memcached -M -m 1024$ memcached -M -m 1024启动时必须注意的是,小写的启动时必须注意的是,小写的“-m”“-m”选项是用来指定最大内存大小的。不指定具体数值选项是用来指定最大内存大小的。不指定具体数值则使用默认值则使用默认值64MB64MB。指定指定“-M”“-M”参数启动后,内存用尽时参数启动后,内存用尽时memcachedmemcached会返回错误。话说回来,会返回错误。话说回来,memcachedmemcached毕竟不是存储器,而是缓存,所以推荐使用毕竟不是存储器,而是缓存,所

86、以推荐使用LRULRU。36一些经验和技巧一些经验和技巧: :MemcachedMemcachedMemcachedMemcached使用线程模式工作使用线程模式工作使用线程模式工作使用线程模式工作在安装的时候必须打开:在安装的时候必须打开:./configure -enable-threads./configure -enable-threads安装完之后,启动的时候看看帮助信息有没有这条:安装完之后,启动的时候看看帮助信息有没有这条:-t number of threads to use, default 4-t number of threads to use, default 4如果存

87、在该选项,说明已经支持了线程,就可以在启动的时候使用如果存在该选项,说明已经支持了线程,就可以在启动的时候使用 -t -t 选项来启动多线程选项来启动多线程然后启动的时候必须加上你需要支持的线程数量:然后启动的时候必须加上你需要支持的线程数量:/usr/local/memcache/bin/memcached -t 1024/usr/local/memcache/bin/memcached -t 102437一些经验和技巧一些经验和技巧: :调优调优调优调优SlabSlabSlabSlab和内存分配和内存分配和内存分配和内存分配1 1 1 1memcachedmemcached在启动时指定在启

88、动时指定 Growth Factor Growth Factor因子(通过因子(通过-f -f选项),就可以在某种程度上控制选项),就可以在某种程度上控制slabslab之间的差异。之间的差异。默认值为默认值为1.251.25。但是,在该选项出现之前,这个因子曾经固定为。但是,在该选项出现之前,这个因子曾经固定为2 2,称为,称为“powers of 2”“powers of 2”策略。策略。让我们用以前的设置,以让我们用以前的设置,以verboseverbose模式启动模式启动memcachedmemcached试试看:试试看:$ memcached -f 2 -vv$ memcached

89、-f 2 -vvslab class 1: chunk size 128 perslab 8192slab class 1: chunk size 128 perslab 8192slab class 2: chunk size 256 perslab 4096slab class 2: chunk size 256 perslab 4096slab class 3: chunk size 512 perslab 2048slab class 3: chunk size 512 perslab 2048slab class 4: chunk size 1024 perslab 1024slab

90、 class 4: chunk size 1024 perslab 1024slab class 5: chunk size 2048 perslab 512slab class 5: chunk size 2048 perslab 512slab class 6: chunk size 4096 perslab 256slab class 6: chunk size 4096 perslab 256slab class 7: chunk size 8192 perslab 128slab class 7: chunk size 8192 perslab 128slab class 8: ch

91、unk size 16384 perslab 64slab class 8: chunk size 16384 perslab 64slab class 9: chunk size 32768 perslab 32slab class 9: chunk size 32768 perslab 32slab class 10: chunk size 65536 perslab 16slab class 10: chunk size 65536 perslab 16slab class 11: chunk size 131072 perslab 8slab class 11: chunk size

92、131072 perslab 8slab class 12: chunk size 262144 perslab 4slab class 12: chunk size 262144 perslab 4slab class 13: chunk size 524288 perslab 2slab class 13: chunk size 524288 perslab 238一些经验和技巧一些经验和技巧: :调优调优调优调优SlabSlabSlabSlab和内存分配和内存分配和内存分配和内存分配2 2 2 2可见,从可见,从128128字节的组开始,组的大小依次增大为原来的字节的组开始,组的大小依次

93、增大为原来的2 2倍。这样设置的问题是,倍。这样设置的问题是,slabslab之间的差别比较大,之间的差别比较大,有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了growth factorgrowth factor这个选项。这个选项。来看看现在的默认设置(来看看现在的默认设置(f=1.25f=1.25)时的输出(篇幅所限,这里只写到第)时的输出(篇幅所限,这里只写到第1010组):组):slab class 1: chunk size 88 perslab 11915slab class 1: chunk size

94、 88 perslab 11915slab class 2: chunk size 112 perslab 9362slab class 2: chunk size 112 perslab 9362slab class 3: chunk size 144 perslab 7281slab class 3: chunk size 144 perslab 7281slab class 4: chunk size 184 perslab 5698slab class 4: chunk size 184 perslab 5698slab class 5: chunk size 232 perslab

95、4519slab class 5: chunk size 232 perslab 4519slab class 6: chunk size 296 perslab 3542slab class 6: chunk size 296 perslab 3542slab class 7: chunk size 376 perslab 2788slab class 7: chunk size 376 perslab 2788slab class 8: chunk size 472 perslab 2221slab class 8: chunk size 472 perslab 2221slab clas

96、s 9: chunk size 592 perslab 1771slab class 9: chunk size 592 perslab 1771slab class 10: chunk size 744 perslab 1409slab class 10: chunk size 744 perslab 1409可见,组间差距比因子为可见,组间差距比因子为2 2时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。有些计算误差,这些误差是为了保持字节数的对

97、齐而故意设置的。将将memcachedmemcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,调整调整growth factorgrowth factor,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。39一些经验和技巧一些经验和技巧: :参考文档和延伸阅读参考文档和延伸阅读参考文档和延伸阅读参考文档和延伸阅读以下为本以下为本PPTPPT参考文档,特别是参考了参考文档,特别是参考了mixi.jp mixi.jp 公司编写的公司编写的MemcachedMemcached全面全面剖析剖析MemcachedMemcached全面剖析:全面剖析:http:/ 1.2 Memcached 1.2 内存模型分析:内存模型分析:http:/ server LRU memcached server LRU 深入分析:深入分析:http:/ http:/ http:/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号