2009-08分享站点:目录索引目录索引33MemcachedMemcached介绍介绍::什么是什么是MemcachedMemcached??MemcachedMemcached是国外社区网站是国外社区网站LiveJournalLiveJournal的开发团队开发的高性能的分布式内的开发团队开发的高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态问次数,以提高动态WebWeb应用的速度、提高可扩展性。应用的速度、提高可扩展性。LiveJournalLiveJournal团队开发了包括团队开发了包括MemcachedMemcached、、MogileFSMogileFS、、PerlbalPerlbal等不错的开等不错的开源项目。源项目。官方网站:官方网站:://介绍介绍MemcachedMemcached运行图运行图55MemcachedMemcached介绍介绍谁在用谁在用MemcachedMemcached??国外国外国内国内66MemcachedMemcached介绍介绍与与MemcachedMemcached类似的还有什么?类似的还有什么?国外国外TokyoCabinetTokyoCabinet::((日本日本mixi.jpmixi.jp公司开发公司开发))国内国内MemcacheDBMemcacheDB::((新浪开源新浪开源TeamTeam开发开发))tmcache:(tmcache:(偶开发的偶开发的^_^)^_^)77MemcachedMemcached介绍介绍MemcachedMemcached的主要特点的主要特点••基于基于C/SC/S架构,协议简单架构,协议简单••基于基于libeventlibevent的事件处理的事件处理••自主内存存储处理自主内存存储处理••基于客户端的基于客户端的MemcachedMemcached分布式分布式88MemcachedMemcached介绍介绍基于基于C/SC/S架构,协议简单架构,协议简单99MemcachedMemcached介绍介绍基于基于libeventlibevent的事件处理的事件处理libeventlibevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/SolarisWindows/Linux/BSD/Solaris等操作系统的的事件处理。等操作系统的的事件处理。包装的接口包括:包装的接口包括:pollpoll、、select(Windows)select(Windows)、、epoll(Linux)epoll(Linux)、、kqueue(BSD)kqueue(BSD)、、/dev/pool(Solaris)/dev/pool(Solaris)MemcachedMemcached使用使用libeventlibevent来进行网络并发连接的处理,能够保持在很大并发情来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。况下,仍旧能够保持快速的响应能力。libevent:~provos/libevent/libevent:~provos/libevent/1010MemcachedMemcached介绍介绍自主的内存存储处理自主的内存存储处理••数据存储方式:数据存储方式:SlabAllocationSlabAllocation••数据过期方式:数据过期方式:LazyExpiration+LRULazyExpiration+LRU1111MemcachedMemcached介绍介绍数据存储方式:数据存储方式:SlabAllocationSlabAllocationSlabAlloctionSlabAlloction构造图构造图SlabAllocatorSlabAllocator的基本原理是按照预先的基本原理是按照预先规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。SlabAllocationSlabAllocation的原理相当简单。的原理相当简单。将将分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块((chunkchunk),并把尺寸相同的块分成组),并把尺寸相同的块分成组((chunkchunk的集合)的集合)1212MemcachedMemcached介绍介绍数据存储方式:数据存储方式:SlabAllocationSlabAllocationSlabClassesSlabClasses分配图分配图PagePage:分配给:分配给SlabSlab的内存空间,默认是的内存空间,默认是1MB1MB。分配给。分配给SlabSlab之后根据之后根据slabslab的大小的大小切分成切分成chunkchunk。。ChunkChunk:用于缓存记录的内存空间。:用于缓存记录的内存空间。SlabClassSlabClass:特定大小的:特定大小的chunkchunk的组。的组。memcachedmemcached根据收到的数据的大小,选根据收到的数据的大小,选择最适合数据大小的择最适合数据大小的slabslab。。memcachedmemcached中保存着中保存着slabslab内空闲内空闲chunkchunk的的列表,根据该列表选择列表,根据该列表选择chunkchunk,然后将,然后将数据缓存于其中。数据缓存于其中。1313MemcachedMemcached介绍介绍::数据存储方式:数据存储方式:SlabAllocationSlabAllocationSlabAlloctionSlabAlloction缺点缺点这个问题就是,由于分配的是特定长度的内存,因此无法有效利用这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将分配的内存。例如,将100100字节的数据缓存到字节的数据缓存到128128字节的字节的chunkchunk中,剩中,剩余的余的2828字节就浪费了。字节就浪费了。1414MemcachedMemcached介绍介绍::数据过期方式数据过期方式••LazyExpirationLazyExpirationmemcachedmemcached内部不会监视记录是否过期,而是在内部不会监视记录是否过期,而是在getget时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过期。这种技术被称为期。这种技术被称为lazylazy(惰性)(惰性)expirationexpiration。因此,。因此,memcachedmemcached不会在过期监视上耗费不会在过期监视上耗费CPUCPU时间。时间。••LRULRUmemcachedmemcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为足的情况,此时就要使用名为LeastRecentlyUsedLeastRecentlyUsed((LRULRU)机制来分配空间。顾名思义,)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当这是删除“最近最少使用”的记录的机制。因此,当memcachedmemcached的内存空间不足时(无法的内存空间不足时(无法从从slabclassslabclass获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。给新的记录。从缓存的实用角度来看,该模型十分理想。1515MemcachedMemcached介绍介绍::基于客户端的基于客户端的MemcachedMemcached分布式分布式1616MemcachedMemcached介绍介绍::基于客户端的基于客户端的MemcachedMemcached分布式分布式////按照按照KeyKey值,获取一个服务器值,获取一个服务器IDIDintgetServerId(char*key,intserverTotal){intgetServerId(char*key,intserverTotal){intc,hash=0;intc,hash=0;while(c=*key++){while(c=*key++){hash+=c;hash+=c;}}returnhash%serverTotal;returnhash%serverTotal;}}////服务器列表服务器列表node[0]=192.168.0.1:11211node[0]=192.168.0.1:11211node[1]=192.168.0.2:11211node[1]=192.168.0.2:11211node[2]=192.168.0.3:11211node[2]=192.168.0.3:11211////获取获取keykey是是tokyotokyo的节点的节点ID(ID(服务器服务器ID)ID)intid=getServerId(test,3);intid=getServerId(test,3);////得出的结果是得出的结果是11,那么对应的机器就是,那么对应的机器就是node[id]==node[1]node[id]==node[1]1717MemcachedMemcached介绍介绍::基于客户端的基于客户端的MemcachedMemcached分布式分布式写入操作写入操作读取操作读取操作1818MemcachedMemcached安装和使用安装和使用::••MemcachedMemcached安装安装••MemcachedMemcached与与PHPPHP结合使用结合使用••MemcachedMemcached与与C/C++C/C++结合使用结合使用1919MemcachedMemcached安装和使用安装和使用::MemcachedMemcached安装安装安装步骤:安装步骤:••先安装先安装libeventlibevent••再安装再安装MemcachedMemcached主程序主程序源码下载:源码下载:((最新版最新版))libeventlibevent官网:官网:~provos/libevent/~provos/libevent/libeventlibevent下载:下载:~provos/libevent~provos/libevent--1.4.91.4.9--stable.tar.gz