论文部分内容阅读
摘要:由于大型网站具有高负载和高并发的特点,Memcached作为一种解决方案在缓存数据量较大的情况下,使用Memcached的命令组合方式遍历缓存无法完成对所有有效数据的查询。本文针对这个方面研究并设计了缓存数据遍历方案,通过对Memcached客户端的应用研究与模拟实现,很好的解决的这个问题。
关键词:Memcached;缓存;遍历
中图分类号:TP333 文献标识码:A文章编号:1007-9599(2012)01-0000-02
Traversal Query Research and Design Based on the Cache System
Deng Shiquan,Lou Xinyuan
(School of Mechanical Engineering,Southwest Jiaotong University,Chengdu610031,China)
Abstract:The traversal query of data by the compound command in the huge web site turns to be difficult because of the high load and concurrency when we take the Memcached as an solution of data caching. This paper focuses on the problem above and provides an new Memcached based data traversal query method.According to the simulation result, the problem could be well solved by this method.
Keywords:Memcached;Cache;Traverse
一、引言
Memcached是为提升站点性能而设计的分布式应用程序。最早是为liveJournal服务,它采用了C/S架构模式。Memcached可以构建高性能的缓存服务器,减少磁盘数据库的访问次数,分担传统数据的压力,并提高动态Web服务器的吞吐量。目前有许多公司都在使用这个缓存工具来构建大负载、高并发的网站。作为一个轻量级的分布式缓存服务器,Memcached没有提供遍历查询接口,许多人对它的遍历都是使用命令组合的方式来完成,这种方法在缓存中的数据量很多的时候,它无法缓存数据遍历的任务。本文设计并实现了基于XML文档的遍历查询方法弥补了这个方法的缺陷。
二、Memcached的工作原理
Memcached是一个高性能的分布式内存对象缓存系统,它的工作机制是在内
存中开辟一块空间,然后建立一个HashTable,并自行管理这些HashTable。Memcached采用名为Slab Allocator的机制来进行分配和管理内存,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)[2]。内存分配原理如图1[2]。
每一个server对数据对象的存储操作都在所切的块中完成,而需要缓存的对象或数据是以键值对(key/value)形式保存在Server端。没有涉及到任何磁盘IO 操作,更不会使用到SWAP 虚拟内存,其性能瓶颈都在网络通信部分 [3]。
Memcached采用最近最少使用(LRU)置换算法,LRU置换算法是选择最近最少使用的页面予以淘汰。当内存不足时,Memcached会从slab各个class中的双向链表的尾部开始检测,
图1
即最近最少使用的页面,往前一直寻找合适的item予以淘汰。LRU算法为slab局部class淘汰的机制。
三、遍历查询的研究与设计
目前,Memcached在公司和网站中的应用越来越广泛,像facebook,youtube,yahoo,sina,sohu,netease,豆瓣等都在或多或少的使用。在特别注重用户体验的网站上,用户对服务器的响应速度要求很高,如sns,blog等web2.0应用的站点,Memcached的表现突出。Memcached自身只提供了get、set[4]等方法,当需要查看Memcached的数据及状态,要批量删除数据或是给部分数据增加、减少失效时间等等,都需要遍历缓存中的内容,下面介绍两种基于Memcached客户端的遍历方法。
(一)基于Memcached的stats命令的设计与实现。这是许多人推荐的遍历方式。其设计主要通过stats items和stats cachedump 这两个命令来实现的。遍历的步骤如下:首先,通过客户端应用程序连接到Memcached服务器。其次,执行客户端程序的MemcachedClient的statsItems命令获取所有的Items数据,从返回的数据中解析出所有的slab id。再次,执行MemcachedClient的statsCacheDump命令,从该命令返回的数据中解析出所有的key(key为ITEM之后、“[”字符之前除空格之外的字符串)。最后,通过得到的有key,使用Memcached提供的get命令遍历缓存中数据。
(二)基于XML文档遍历查询的设计与实现。在Memcached中的数据是以键值对(key/value)的方式存储的,并且Memcached没有提供直接遍历Memcached缓存数据的接口,因此要获取到Memcached的缓存中的数据,首先必须获取到存储在cache中的key,因此,获取缓存中所有key是遍历Memcached缓存的前提条件。本方法的设计是基于一个存储介质(存储介质可以是数据库表,XML文档等)来保存Memcached中所有key的信息,通过客户端来维护关于key的数据表或XML文档。
本文的设计是基于XML文档的,文档结构如下所示:
<?xml version="1.0" encoding="utf-8"?>
mykey1
0
0
0
liming
......
......
为了便于实时更新XML文档,在节点结构中加入了当前时间,过期时间,修改时间以及用户等信息。当第一次向Memcached服务器增加数据时,客户端便创建XML文档,并向XML文档中插入一条节点数据。在之后的操作中,针对每次的操作都对文档做相应的维护。遍历步骤如下
首先,通过客户端应用程序连接到Memcached服务器。其次,需要执行遍历Memcached缓存中的数据时,先从相应的XML文档中读取所有的key,并通过过期时间与当前时间进行对比,剔除过期的key。获取XML文档中的有效key。最后,通过得到的所有key字段,使用Memcached提供的get命令遍历缓存中数据。
四、两种方案测试结果对比
其测试环境配置如下:在测试过程中,使用的是两台相同配置的个人PC机,一台作为客户端使用,一台作为Memcached服务器。
PC机配置如下:
CPU:Inter Pentium(R) T4200 2GHz;内存:3G;硬盘:250G;操作系统:Windows XP professional sp3;
Memcached软件配置如下:
Memcached版本:Memcached-win32-1.4.4-14;Memcached进程数:1;启动参数:Memcached.exe –d –m 350 –p 11211 start;操作系统:Windows XP professional sp3
测试过程中一共使用了10组数据,其数据记录总数分别为:1万、2万、5万、8万、10万、12万、15万、20万、30万、40万。测试过程又分三种情况进行对比:无过期数据记录、有1/4的过期数据记录、有1/2的过期数据记录。其对比结果分别如图2、图3、图4所示。
图2
图3
图4
从图2可以看出方案一(基于Memcached的stats命令的设计与实现)在查询性能上优于方案二(基于XML文档遍历查询的设计),从图3(存在1/4的过期记录)和图4(存在1/2的过期记录)可以看出方案二在查询性能上优于方案一,并随着过期记录的比例增大,查询性能的差异也变得更加明显。两种方案优缺点对比结果如表一所示。
表一 两种方案优缺点对比
在测试过程中,测试数据量为80万条时,方案一由于Memcached系统设计的限制(这个限制也可参考源码文件Items.c中的char *do_item_cachedump()[1]方法。),无法遍历到全部有效记录。表二列出了方案一和方案二遍历查询所得到的结果。
表二 80万条数据记录查询结果
从表二的数据可以看出,当数据没有过期记录,有效数据为80万时,方案一实际遍历了434424调记录,获取到有效记录数为434424,没有获取到所有的有效数据(80万)。方案二达到了预期的遍历结果。当数据有过期记录(过期记录量为总量的1/4)时,方案一实际遍历了434424条数据,实际获取到的有效记录数为325818,没有获取到所有的有效数据(60万)。方案二达到了预期的遍历结果。
五、总结
Memcached是一个基于key-value存储的系统,它提供了高效的set、get[4]等命令,出于性能方面的考虑,Memcached并没有提供直接的遍历的操作。但是在某些时候,的确需要遍历Memcached中缓存的数据。由于遍历Memcached缓存数据的开销比较大,因此,遍历操作要谨慎使用。本文设计并实现了数据遍历的方法,满足了这种需求,并通过实验证实了设计方案和实现步骤是可行和有效的。
参考文献:
[1]Memcached website:http://memcached.org/
[2]长野雅广,前坂徹著.charlee 译.memcached全面剖析. www.idv2.com
[3]宗小忠.基于Memcached构建Web缓存服务器[J].电脑知识与技术.2011.2
[4]http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
关键词:Memcached;缓存;遍历
中图分类号:TP333 文献标识码:A文章编号:1007-9599(2012)01-0000-02
Traversal Query Research and Design Based on the Cache System
Deng Shiquan,Lou Xinyuan
(School of Mechanical Engineering,Southwest Jiaotong University,Chengdu610031,China)
Abstract:The traversal query of data by the compound command in the huge web site turns to be difficult because of the high load and concurrency when we take the Memcached as an solution of data caching. This paper focuses on the problem above and provides an new Memcached based data traversal query method.According to the simulation result, the problem could be well solved by this method.
Keywords:Memcached;Cache;Traverse
一、引言
Memcached是为提升站点性能而设计的分布式应用程序。最早是为liveJournal服务,它采用了C/S架构模式。Memcached可以构建高性能的缓存服务器,减少磁盘数据库的访问次数,分担传统数据的压力,并提高动态Web服务器的吞吐量。目前有许多公司都在使用这个缓存工具来构建大负载、高并发的网站。作为一个轻量级的分布式缓存服务器,Memcached没有提供遍历查询接口,许多人对它的遍历都是使用命令组合的方式来完成,这种方法在缓存中的数据量很多的时候,它无法缓存数据遍历的任务。本文设计并实现了基于XML文档的遍历查询方法弥补了这个方法的缺陷。
二、Memcached的工作原理
Memcached是一个高性能的分布式内存对象缓存系统,它的工作机制是在内
存中开辟一块空间,然后建立一个HashTable,并自行管理这些HashTable。Memcached采用名为Slab Allocator的机制来进行分配和管理内存,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)[2]。内存分配原理如图1[2]。
每一个server对数据对象的存储操作都在所切的块中完成,而需要缓存的对象或数据是以键值对(key/value)形式保存在Server端。没有涉及到任何磁盘IO 操作,更不会使用到SWAP 虚拟内存,其性能瓶颈都在网络通信部分 [3]。
Memcached采用最近最少使用(LRU)置换算法,LRU置换算法是选择最近最少使用的页面予以淘汰。当内存不足时,Memcached会从slab各个class中的双向链表的尾部开始检测,
图1
即最近最少使用的页面,往前一直寻找合适的item予以淘汰。LRU算法为slab局部class淘汰的机制。
三、遍历查询的研究与设计
目前,Memcached在公司和网站中的应用越来越广泛,像facebook,youtube,yahoo,sina,sohu,netease,豆瓣等都在或多或少的使用。在特别注重用户体验的网站上,用户对服务器的响应速度要求很高,如sns,blog等web2.0应用的站点,Memcached的表现突出。Memcached自身只提供了get、set[4]等方法,当需要查看Memcached的数据及状态,要批量删除数据或是给部分数据增加、减少失效时间等等,都需要遍历缓存中的内容,下面介绍两种基于Memcached客户端的遍历方法。
(一)基于Memcached的stats命令的设计与实现。这是许多人推荐的遍历方式。其设计主要通过stats items和stats cachedump
(二)基于XML文档遍历查询的设计与实现。在Memcached中的数据是以键值对(key/value)的方式存储的,并且Memcached没有提供直接遍历Memcached缓存数据的接口,因此要获取到Memcached的缓存中的数据,首先必须获取到存储在cache中的key,因此,获取缓存中所有key是遍历Memcached缓存的前提条件。本方法的设计是基于一个存储介质(存储介质可以是数据库表,XML文档等)来保存Memcached中所有key的信息,通过客户端来维护关于key的数据表或XML文档。
本文的设计是基于XML文档的,文档结构如下所示:
<?xml version="1.0" encoding="utf-8"?>
......
......
为了便于实时更新XML文档,在节点结构中加入了当前时间,过期时间,修改时间以及用户等信息。当第一次向Memcached服务器增加数据时,客户端便创建XML文档,并向XML文档中插入一条节点数据。在之后的操作中,针对每次的操作都对文档做相应的维护。遍历步骤如下
首先,通过客户端应用程序连接到Memcached服务器。其次,需要执行遍历Memcached缓存中的数据时,先从相应的XML文档中读取所有的key,并通过过期时间与当前时间进行对比,剔除过期的key。获取XML文档中的有效key。最后,通过得到的所有key字段,使用Memcached提供的get命令遍历缓存中数据。
四、两种方案测试结果对比
其测试环境配置如下:在测试过程中,使用的是两台相同配置的个人PC机,一台作为客户端使用,一台作为Memcached服务器。
PC机配置如下:
CPU:Inter Pentium(R) T4200 2GHz;内存:3G;硬盘:250G;操作系统:Windows XP professional sp3;
Memcached软件配置如下:
Memcached版本:Memcached-win32-1.4.4-14;Memcached进程数:1;启动参数:Memcached.exe –d –m 350 –p 11211 start;操作系统:Windows XP professional sp3
测试过程中一共使用了10组数据,其数据记录总数分别为:1万、2万、5万、8万、10万、12万、15万、20万、30万、40万。测试过程又分三种情况进行对比:无过期数据记录、有1/4的过期数据记录、有1/2的过期数据记录。其对比结果分别如图2、图3、图4所示。
图2
图3
图4
从图2可以看出方案一(基于Memcached的stats命令的设计与实现)在查询性能上优于方案二(基于XML文档遍历查询的设计),从图3(存在1/4的过期记录)和图4(存在1/2的过期记录)可以看出方案二在查询性能上优于方案一,并随着过期记录的比例增大,查询性能的差异也变得更加明显。两种方案优缺点对比结果如表一所示。
表一 两种方案优缺点对比
在测试过程中,测试数据量为80万条时,方案一由于Memcached系统设计的限制(这个限制也可参考源码文件Items.c中的char *do_item_cachedump()[1]方法。),无法遍历到全部有效记录。表二列出了方案一和方案二遍历查询所得到的结果。
表二 80万条数据记录查询结果
从表二的数据可以看出,当数据没有过期记录,有效数据为80万时,方案一实际遍历了434424调记录,获取到有效记录数为434424,没有获取到所有的有效数据(80万)。方案二达到了预期的遍历结果。当数据有过期记录(过期记录量为总量的1/4)时,方案一实际遍历了434424条数据,实际获取到的有效记录数为325818,没有获取到所有的有效数据(60万)。方案二达到了预期的遍历结果。
五、总结
Memcached是一个基于key-value存储的系统,它提供了高效的set、get[4]等命令,出于性能方面的考虑,Memcached并没有提供直接的遍历的操作。但是在某些时候,的确需要遍历Memcached中缓存的数据。由于遍历Memcached缓存数据的开销比较大,因此,遍历操作要谨慎使用。本文设计并实现了数据遍历的方法,满足了这种需求,并通过实验证实了设计方案和实现步骤是可行和有效的。
参考文献:
[1]Memcached website:http://memcached.org/
[2]长野雅广,前坂徹著.charlee 译.memcached全面剖析. www.idv2.com
[3]宗小忠.基于Memcached构建Web缓存服务器[J].电脑知识与技术.2011.2
[4]http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt