MemcachedMemcachedMemcachedMemcached原理和使用详解原理和使用详解原理和使用详解原理和使用详解作者:heiyeluren(黑夜路人)2009-01博客:MemcachedMemcached介绍介绍MemcachedMemcached安装安装和使用和使用一些技巧一些技巧Q&AQ&ATechTalkTechTalkTechTalkTechTalkTechTalkTechTalkTechTalkTechTalk目录索引目录索引3MemcachedMemcached介绍介绍::什么是什么是MemcachedMemcached??MemcachedMemcached是国外是国外社区社区网站网站LiveJournalLiveJournal的开发团队开发的的开发团队开发的高性能的分布式内高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态问次数,以提高动态WebWeb应用的速度、提高可扩展性。应用的速度、提高可扩展性。LiveJournalLiveJournalLiveJournalLiveJournalLiveJournalLiveJournalLiveJournalLiveJournal团队开发了包括团队开发了包括MemcachedMemcachedMemcachedMemcachedMemcachedMemcachedMemcachedMemcached、、MogileFSMogileFSMogileFSMogileFSMogileFSMogileFSMogileFSMogileFS、、PerlbalPerlbalPerlbalPerlbalPerlbalPerlbalPerlbalPerlbal等不错的开等不错的开源项目。源项目。官方网站:官方网站:://://://://://://://介绍介绍MemcachedMemcached运行图运行图5MemcachedMemcached介绍介绍谁在用谁在用MemcachedMemcached??国外国外国内国内6MemcachedMemcached介绍介绍与与MemcachedMemcached类似的还有什么类似的还有什么??国外国外TokyoCabinetTokyoCabinet::((日本日本mixi.jpmixi.jp公司公司开发开发))国内国内MemcacheDBMemcacheDB::((新浪开源新浪开源TeamTeam开发开发))tmcache:tmcache:((偶开发的偶开发的^_^)^_^)7MemcachedMemcached介绍介绍MemcachedMemcached的主要特点的主要特点••基于基于C/SC/S架构,架构,协议简单协议简单••基于基于libeventlibevent的事件处理的事件处理••自主内存存储处理自主内存存储处理••基于客户端的基于客户端的MemcachedMemcached分布式分布式8MemcachedMemcached介绍介绍基于基于C/SC/S架构,协议简单架构,协议简单9MemcachedMemcached介绍介绍基于基于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:libevent:~provos/libevent/~provos/libevent/10MemcachedMemcached介绍介绍自主的内存存储处理自主的内存存储处理••数据数据存储方式:存储方式:SlabAllocationSlabAllocation••数据数据过期过期方式:方式:LazyExpiration+LRULazyExpiration+LRU11MemcachedMemcached介绍介绍数据存储方式:数据存储方式:SlabAllocationSlabAllocationSlabAlloctionSlabAlloction构造图构造图SlabAllocatorSlabAllocator的基本原理是按照预先的基本原理是按照预先规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。SlabAllocationSlabAllocation的原理相当简单。的原理相当简单。将将分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块((chunkchunk),并把尺寸相同的块分成组),并把尺寸相同的块分成组((chunkchunk的集合)的集合)12MemcachedMemcached介绍介绍数据存储方式:数据存储方式:SlabAllocationSlabAllocationSlabSlabClassesClasses分配图分配图PagePage::分配给分配给SlabSlab的内存空间,默认是的内存空间,默认是1MB1MB。分配给。分配给SlabSlab之后根据之后根据slabslab的大小的大小切分成切分成chunkchunk。。ChunkChunk::用于缓存记录的内存空间。用于缓存记录的内存空间。SlabClassSlabClass::特定大小的特定大小的chunkchunk的组。的组。memcachedmemcached根据收到的数据的大小,选根据收到的数据的大小,选择最适合数据大小的择最适合数据大小的slabslab。。memcachedmemcached中保存着中保存着slabslab内空闲内空闲chunkchunk的的列表,根据该列表选择列表,根据该列表选择chunkchunk,然后将,然后将数据缓存于其中。数据缓存于其中。13MemcachedMemcached介绍介绍::数据存储方式:数据存储方式:SlabAllocationSlabAllocationSlabAlloctionSlabAlloction缺点缺点这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将配的内存。例如,将100100字节的数据缓存到字节的数据缓存到128128字节的字节的chunkchunk中,剩余中,剩余的的2828字节就浪费了。字节就浪费了。14MemcachedMemcached介绍介绍::数据过期方式数据过期方式••LazyExpirationLazyExpirationmemcachedmemcached内部不会监视记录是否过期,而是在内部不会监视记录是否过期,而是在getget时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过期。这种技术被称为期。这种技术被称为lazylazy(惰性)(惰性)expirationexpiration。因此,。因此,memcachedmemcached不会在过期监视上耗费不会在过期监视上耗费CPUCPU时间。时间。••LRULRUmemcachedmemcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为足的情况,此时就要使用名为LeastRecentlyUsedLeastRecentlyUsed((LRULRU)机制来分配空间。顾名思)机制来分配空间。顾名思义,这是删除义,这是删除““最近最少使用最近最少使用””的记录的机制。因此,当的记录的机制。因此,当memcachedmemcached的内存空间不足时的内存空间不足时(无法从(无法从slabclassslabclass获取到新的空间时),就从最近未被使用的记录中搜索,并将其空获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。间分配给新的记录。从缓存的实用角度来看,该模型十分理想。15MemcachedMemcached介绍介绍::基于客户端的基于客户端的MemcachedMemcached分布式分布式16MemcachedMemcached介绍介绍::基于客户端的基于客户端的MemcachedMemcached分布式分布式////按照按照KeyKey值,获取一个服务器值,获取一个服务器IDIDintintgetServergetServerIdId(char(char**key,intserverTotal){key,intserverTotal){intc,intc,hash=0;hash=0;while(c=while(c=**key++){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=intid=getServerId(getServerId(testtest,,33););////得出的结果是得出的结果是11,那么对应的机器就是,那么对应的机器就是node[id]==node[id]==node[node[11]]17MemcachedMemcached介绍介绍::基于客户端的基于客户端的MemcachedMemca