Memcached在彩印SNS网站上的应用2012-09《电信工程技术与标准化》
涂婷婷1, 2,王晶1, 2,王纯1, 2
1北京邮电大学网络与交换技术国家重点实验室,北京(100876)
2东信北邮信息技术有限公司,北京(100191)
E-mail:tutingting@ebupt.com
摘 要: 随着彩印业务的不断发展壮大,彩印SNS(Social Networking Services)网站用户访问量逐渐增多,对服务器的性能要求也越来越高。本文主要介绍了在SSH(Spring+Struts+Hibernate)框架下应用memcached缓存技术对彩印SNS网站进行改造,通过减少数据库访问数,加快web请求处理能力。
关键词: SNS memcached SSH maven
Using Memcached in Call Signature Service SNS Website
Tu Tingting1, 2,Wang Jing1, 2, Wang Chun1, 2
1 State Key Laboratory of Networking and Switching Technology,Beijing University of Posts and Telecommunications,Beijing (100876)
2 EBUPT Information Technology Co. Ltd.,Beijing (100191)
E-mail:tutingting@ebupt.com
Abstract: With the rapid development of the call signature service of China Mobile, more and more users visit its SNS(Social Networking Services) website. It requires web service with higher speed and better performance. This article introduced the reconstruction of the SNS website under the SSH(Spring+Struts+Hibernate) framework with the memcached caching technology. It improved web application performance through reducing the database access.
Key words:SNS memcached SSH maven
1. 引 言
随着彩印业务的不断发展壮大,彩印SNS(Social Networking Services)网站的用户访问量逐渐增多,数据库的负担越来越重,网站响应速度也越来越慢,用户体验随即变差。为了增强用户体验,提高网站响应速度,应用缓存不失为一种好的解决办法,而近年来,随着内存容量的飞速扩张和价格的不断下降, 使用内存缓存[1]开始成为一种趋势和可能。
根据操作系统经典二八理论,20%的数据通常在80%的时间内被访问,如果能够把这20%的频繁访问的数据在第一次访问时直接存入内存,那么再次访问时可以直接从内存中获取数据,这显然比重新访问数据库要快得多。memcached作为一款高性能的分布式内存缓存服务器,可以将数据库查询结果缓存至内存,通过减少数据库访问次数,从而提高动态Web应用的速度、提高可扩展性。
2. memcached介绍
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的机制分配、管理内存,通过在内存里维护一个统一的、巨大的hash表,用来存储各种格式的数据。其基本原理是将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组slab(chunk的集合),如图1所示:
图1 Slab Allocator的构造图
2.2. memcached缓存记录的原理
默认分配给组的内存大小为1MB,其中块的大小可以根据将存入缓存的最小字节数而定。memcached根据收到的将要缓存数据的大小,选择最适合数据大小的组(如图2),memcached中保存着组内空闲块的列表,根据该列表选择块,以便最好的利用内存空间,减少空间碎片[3]。
图2 存入块的选择
memcached会给存入缓存里的每个记录加上一个时间戳,但其内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。当内存空间不足时,memcached会优先使用已超时的记录的空间,如果空间仍然不足,会通过LRU机制来整理空间,即删除 “最近最少使用”的记录,并将其空间分配给新的记录,以此解决内存不足的问题。
3. memcached应用在彩印SNS上的实现
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 请求访问过程
3.2. memcached服务端的安装及启动
下载memcached for window版memcached-1.2.4-Win32-Preview-20080309_bin.zip,解压文件,进入C:\Windows\System32,以管理员身份运行cmd.exe,输入memcached.exe -d install 即安装成功,在windows服务中即可看到memcached server服务;cmd中输入memcached.exe -d start即启动服务,输入telnet 127.0.0.1 11211,输入stats查看详细信息,如果有信息输出,说明连接成功,quit退出。
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/java-memcached-2.6.6.pom.xml,将memcached client 的jar包安装到本地库中。
3.4. 相关配置文件
1) maven的配置
在底层core里的pom中添加memcached依赖,如下所示:
com.danga
java-memcached
2.6.6
|
以上配置后,即可使用memcached客户端了[2]。
2) spring 配置
新建applicationContext-memcache.xml文件,对memcached服务端进行配置,指定其服务器地址和端口,memcached安装时默认端口为11211,地址即为本机地址,如下:
同时在applicationContext-service.xml中加入bean的配置,如下:
neeaMemcachedPool
class="com.ebupt.caiyin.core.service.impl.MemcachedServiceImpl">
|
其中memClient指明依赖的memcached 客户端(即先前配置到本地库中的jar包),memcachedService是一个接口,包含memcached的四个基本方法add,delete,set,get,并调用MemCachedClient的方法对其进行实现。
3) 资源文件的加载
配置完毕后,还需要在web.xml中加入该配置文件:
contextConfigLocation
/WEB-INF/applicationContext-service.xml
/WEB-INF/applicationContext-memcache.xml
|
以上配置完毕后,可以直接在Action里面调用memClient的get,set方法即可。
3.5. 应用memcached前后性能比较
将memcached配置在服务器与数据库之间,页面请求时,相应的action进行处理,第一次请求时,查询数据库,将结果返回给用户,同时memcached 将页面传来的参数组装成string作为key,将返回给页面的结果组装成string作为value通过set方法存入内存,下次相同的请求来临时,服务器会先判断该key是否在缓存中,如果在,直接从缓存通过get取得结果返回,否则查询数据库,程序可以通过System.currentTimeMillis()记录两次请求返回的时间,输出如下:
2012-06-15 17:42:39,431 INFO [com.ebupt.caiyin.web.action.ChartAction] - <已写入缓存: 时间为:endTime-beginTime=1197>
2012-06-15 17:43:38,161 INFO [com.ebupt.caiyin.web.action.ChartAction] - <直接使用缓存!>
2012-06-15 17:43:38,164 INFO [com.ebupt.caiyin.web.action.ChartAction] - < 时间为:endTime-beginTime=3>
|
可以发现,两次相同的请求,第二次请求时时间明显减少了很多。
通过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前后性能比较
执行次数
|
10
|
100
|
500
|
1000
|
5000
|
10000
|
应用memcached前 /s
|
0.189
|
1.835
|
7.135
|
13.116
|
62.381
|
119.682
|
应用memcached后/s
|
0.152
|
1.764
|
4.597
|
10.092
|
50.772
|
98.552
|
加速比
|
1.243
|
1.040
|
1.552
|
1.30
|
1.229
|
1.214
|
由上表可以看出,应用memcached,当大量请求并发来临时,服务器执行速度明显加快。
4. 结束语
本文主要介绍了在SSH框架下将memcached作为缓存服务器应用于彩印SNS网站的过程,针对应用前后分别进行了压力测试,发现当大量请求并发来临时,应用memcached缓存后服务器执行速度明显加快。将memcached部署在服务器与数据库之间,在很大程序上减轻了数据库的访问压力,有效提高了数据访问的速度。
参考文献
[1] Yang Bo,Liao Jianxin,Zhu Xiaomin.Two-level proxy:The media streaming cache architecture for GPRS mobile network[C]//Proceedings of International Conference on Information Networking,Sendai,Japan.2006.
[2] 长野雅广、前坂徹. memcached全面剖析 http://tech.idv2.com/2008/08/17/memcachepdf
[3] Memcached官方站点 http://www.danga.com/memcached/
[4] 段鹏,张寒云,何磊.基于Spring和Memcached的iBATIS二级缓存的研究与应用[J].云南民族大学学报:自然科学版,2009,18(4):375-378
*基金项目:国家自然科学基金(No. 61072057,61101119,61121001,60902051);长江学者和创新团队发展计划资助(No. IRT1049);国家科技重大专项(No. 2011ZX03002-001-01,移动互联网总体架构研究).