涂婷婷,王晶,王纯
(1 北京邮电大学网络与交换技术国家重点实验室,北京 100876;2 东信北邮信息技术有限公司,北京 100191)
Memcached在彩印SNS网站上的应用*
涂婷婷1,2,王晶1,2,王纯1,2
(1 北京邮电大学网络与交换技术国家重点实验室,北京 100876;2 东信北邮信息技术有限公司,北京 100191)
随着彩印业务的不断发展壮大,彩印SNS(Social Networking Services)网站用户访问量逐渐增多,对服务器的性能要求也越来越高。本文主要介绍了在SSH(Spring+Struts+Hibernate)框架下应用memcached缓存技术对彩印SNS网站进行改造,通过减少数据库访问数,加快Web请求处理能力。
SNS;Memcached;SSH; Maven
随着彩印业务的不断发展壮大,彩印SNS(Social Networking Services)网站的用户访问量逐渐增多,数据库的负担越来越重,网站响应速度也越来越慢,用户体验随即变差。为了增强用户体验,提高网站响应速度,应用缓存不失为一种好的解决办法,而近年来,随着内存容量的飞速扩张和价格的不断下降, 使用内存缓存[1]开始成为一种趋势和可能。
根据操作系统经典二八理论,20%的数据通常在80%的时间内被访问,如果能够把这20%的频繁访问的数据在第一次访问时直接存入内存,那么再次访问时可以直接从内存中获取数据,这显然比重新访问数据库要快得多。Memcached作为一款高性能的分布式内存缓存服务器,可以将数据库查询结果缓存至内存,通过减少数据库访问次数,从而提高动态Web应用的速度、提高可扩展性。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric 为首开发的一款软件。它作为高速运行的分布式缓存服务器,具有协议简单、基于Libevent的事件处理、内置内存存储方式三大特点。Memcached协议简单,其服务器客户端通信并不使用复杂的XML等格式,而是使用简单的基于文本行的协议; Memcached使用Libevent库,它将Linux的Epoll、BSD类操作系统的Kqueue等事件处理功能封装成统一的接口,即使对服务器的连接数增加,也能发挥O(1)的性能;Memcached将保存的数据存储在内置的内存存储空间中,由于数据仅存在于内存中,因此重启Memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used 近期最少使用)算法自动删除使用很少的缓存,因此, Memcached并没有过多考虑数据的永久性问题[2]。
2.1 Memcached内存管理方式
Memcached采用了Slab Allocator的机制分配、管理内存,通过在内存里维护一个统一的、巨大的散列表,用来存储各种格式的数据。其基本原理是将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组Slab(chunk的集合),如图1所示。
图1 Slab Allocator的构造图
2.2 Memcached缓存记录的原理
默认分配给组的内存大小为1MB,其中块的大小可以根据将存入缓存的最小字节数而定。Memcached根据收到的将要缓存数据的大小,选择最适合数据大小的组(如图2所示),Memcached中保存着组内空闲块的列表,根据该列表选择块,以便最好的利用内存空间,减少空间碎片[3]。
图2 存入块的选择
Memcached会给存入缓存里的每个记录加上一个时间戳,但其内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。当内存空间不足时,Memcached会优先使用已超时的记录的空间,如果空间仍然不足,会通过LRU机制来整理空间,即删除 “最近最少使用”的记录,并将其空间分配给新的记录,以此解决内存不足的问题。
Memcached作为一款高性能的分布式内存缓存服务器可以将数据库查询结果缓存至内存,通过减少数据库访问次数, 提高动态Web应用的速度、提高可扩展性,以下主要介绍如何在彩印SNS中应用Memcached。
3.1 架构方案
彩印SNS网站设计采用当前主流框架SSH,其中Spring负责业务层管理,即Service(或 Manager),为Action提供统一的调用接口并封装持久层的 DAO,并且还对Javabean进行统一的管理,同时集成Hibernate;Hibernate作为数据持久化层 , 是一种对象、关系的映射工具,提供了从Java类到数据表的映射,也提供了数据查询和恢复等机制,把对数据库的直接操作, 转换为对持久对象的操作; Struts负责Web层,接收网页中表单提交的数据,通过Action进行处理,进而将处理结果返回给页面。
采用Memcached作为缓存,位于服务器及数据库之间,Action接收页面请求进行处理时,先查询结果是否在缓存中,如果在,则直接使用缓存,否则查询数据库,将结果返回的同时将结果写入缓存[4],过程如图3所示。
3.2 Memcached服务端的安装及启动
下载Memcached for Window版Memcached-1.2.4-Win32-Preview-20080309_bin.zip,解压文件,进入C:WindowsSystem32,以管理员身份运行cmd.exe,输入memcached.exe -d install即安装成功,在Windows服务中即可看到Memcached Server服务;cmd中输入memcached.exe -d start即启动服务,输入telnet 127.0.0.1 11211,输入stats查看详细信息,如果有信息输出,说明连接成功,quit退出。
图3 请求访问过程
3.3 Memcached Java 客户端的安装
由于目前Memcached Java客户端没有官方的jar包可以配置到Maven中直接依赖,因此需要手动将其安装到本地Maven库。编写java-memcached-2.6.6.pom.xml文件,在pom文件里面指明生成的jar包的groupId、artifactId及依赖的三个包slf4j-simple、slf4j-api、commons-pool,然后将java memcached client的jar包和pom文件一起安装,通过命令mvn install:install-file -Dfile=D:/ software/java_memcached-release_2.6.6/java_ memcached-release_2.6.6.jar-DpomFile=D:/ software/java_memcached-release_2.6.6/javamemcached-2.6.6.pom.xml,将memcached client的jar包安装到本地库中。
3.4 相关配置文件
3.4.1 Maven的配置
在底层core里的pom中添加memcached依赖,如下所示:
以上配置后,即可使用memcached客户端了[2]。
3.4.2 Spring 配置
新建applicationContext-memcache.xml文件,对memcached服务端进行配置,指定其服务器地址和端口,memcached安装时默认端口为11211,地址即为本机地址,如下:
同时在applicationContext-service.xml中加入bean的配置,如下:
其中memClient指明依赖的memcached 客户端(即先前配置到本地库中的jar包),memcachedService是一个接口,包含memcached的4个基本方法add,delete, set, get,并调用MemCachedClient的方法对其进行实现。
3.4.3 资源文件的加载
配置完毕后,还需要在web.xml中加入该配置文件:
以上配置完毕后,可以直接在Action里面调用memClient的get,set方法即可。
3.5 应用Memcached前后性能比较
将Memcached配置在服务器与数据库之间,页面请求时,相应的action进行处理,第一次请求时,查询数据库,将结果返回给用户,同时Memcached将页面传来的参数组装成string作为key,将返回给页面的结果组装成string作为value通过set方法存入内存,下次相同的请求来临时,服务器会先判断该key是否在缓存中,如果在,直接从缓存通过get取得结果返回,否则查询数据库,程序可以通过System.currentTime Millis()记录两次请求返回的时间,输出如下:
可以发现,两次相同的请求,第二次请求时时间明显减少了很多。
通过apache自带的ab(ApacheBench)压力测试工具对请求进行压力测试,该工具可以同时模拟多个并发请求,测试多个请求并发来临时服务器处理时间,首先通过cmd进入apache目录如D:/software/apache 2.2/bin ,命令为ab -c 请求数 -n 线程数 网址/ ,如输入ab c 10 n 10 http://localhost: 8080/music/ api/getRecoma ndList.do?lastModifyTime=0/,其中第一个10表示同时有10个请求,第二个10表示10个进程并发执行,后面的网址为目标网址,网址后加“/”表示启动ab, 实验结果如表1所示。
由表1可以看出,应用Memcached,当大量请求并发来临时,服务器执行速度明显加快。
表1 应用Memcached前后性能比较
本文主要介绍了在SSH框架下将Memcached作为缓存服务器应用于彩印SNS网站的过程,针对应用前后分别进行了压力测试,发现当大量请求并发来临时,应用Memcached缓存后服务器执行速度明显加快。将Memcached部署在服务器与数据库之间,在很大程度上减轻了数据库的访问压力,有效提高了数据访问的速度。
[1] Yang B, Liao J X, Zhu X M. Two-level proxy: the media streaming cache architecture for GPRS mobile network[A]. Proceedings of International Conference on Information Networking[C], Sendai,Japan.2006.
[2] 长野雅广, 前坂徹. Memcached全面剖析[EB/OL]. http://tech. idv2.com/2008/08/17/memcachepdf
[3] Memcached官方站点[EB/OL]. http://www.danga.com/memcached/
[4] 段鹏, 张寒云, 何磊. 基于Spring和Memcached的iBATIS二级缓存的研究与应用[J]. 云南民族大学学报:自然科学版, 2009,18(4):375-378.
我院与大唐无线创新中心举办TD—LTE无线技术深度研讨会
2012年8月9~10日,我院技术部与大唐无线创新中心在北京举办为期两天的“TD-LTE无线技术深度研讨会”。我院蒋远副院长出席并致辞,高度评价了大唐电信在TDLTE规模试验网的优秀表现以及在TD-LTE产业发展上做出的巨大贡献,并希望双方在TD-LTE网规/网优等网络技术创新方面加强研讨和合作。
院副总工程师张玉胜、院技术部总经理兼研究所所长高鹏,院本部无线所所长汤利民、网优所陈欣伟,无线所、网优所、研究所及来自十三家分院的部分领导和技术骨干共计70余名代表参加研讨。
研讨会上,我院专家分别详细介绍了TD-LTE规模试验网情况、TD-LTE网络规划/优化方法、创新方案及建设指导意见、规范等内容;大唐无线创新中心总经理王映民博士就TD-LTE系统技术做了专题报告;创新中心专家分别就TDLTE系统设备与芯片、终端等产业发展关键问题、TD-LTE技术标准、预研的研究进展及TD-LTE未来演进的方向等专题做了精彩演讲。
会上,蒋远副院长详细询问了TD-LTE终端与芯片发展存在的问题。同时指出终端和芯片涉及多种因素和众多环节,终端厂商应结合客户需求和运营需要,在设计和应用时有所侧重,避免面面俱到。双方与会专家就其他技术问题展开热烈讨论,达到了深度研讨的效果。
会后,蒋远副院长与到场专家一起,亲自参加了研讨效果测试。不但极大鼓舞了大家钻研学习TD-LTE的热情,同时也巩固、检验了研讨会的学习效果。
Using Memcached in call signature service SNS Web site
TU Ting-ting1,2, WANG Jing1,2, WANG Chun1,2
(1 State Key Laboratory of Networking and Switching Technology, Beijing University of Posts and Telecommunications, Beijing 100876, China; 2 EBUPT Information Technology Co. Ltd., Beijing 100191, China)
With the rapid development of the call signature service of China Mobile, more and more users visit its SNS(Social Networking Services) Web site. It requires Web service with higher speed and better performance. This article introduced the reconstruction of the SNS Web site under the SSH(Spring+Struts+Hibernate) framework with the Memcached caching technology. It improved Web application performance through reducing the database access.
SNS; Memcached; SSH; maven
TN929.5
A
1008-5599(2012)09-0086-05
2012-08-28
国家自然科学基金(No. 61072057,61101119,61121001,60902051);长江学者和创新团队发展计划资助(No. IRT1049);国家科技重大专项(No. 2011ZX03002-001-01,移动互联网总体架构研究)。