内存缓存技术在门户网站开发中的应用研究

时间:2022-10-06 09:19:52

内存缓存技术在门户网站开发中的应用研究

摘要:该文创造性地探讨了内存缓存技术在门户网站开发中的应用,介绍了Memcached这一杰出成果在的应用情况,并就其实际存在的一些缺陷进行了深入分析。

关键词:内存缓存;门户网站;Memcached

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)25-1415-02

The Application Research of Memory Cache Technology in the Major Website

YANG Li-shen, CAO Zhi-yi

(Henan Polytechnic University Network Center, Jiaozuo 454003, China)

Abrstract: This article creativelydiscussed the application of memory cache technology in the major website, introduced this outstanding achievement Memcached's using in the , and has carried on the deep analysis on its actual existence's flaws.

Key words: memory cache; the major website; Memcached

1 引言

门户网站开发首要解决的就是速度的问题,但是当我们的数据达到百万以上级别,同时又有百万个用户经常光顾的时候,系统的响应速度就会非常慢。一般的解决办法就是优化数据库,提高硬件的性能,增大带宽等,但是当这些条件一定的情况下,并且我们的资金和技术有限制的时候就是需要采用软的方法(即缓存技术)进行处理。

在过去的几十年里,先驱们不懈探索,最初的缓存做法是在线程内对对象进行缓存,但这样进程间就无法共享缓存,命中率非常低,导致缓存效率极低。后来出现了共享内存的缓存,多个进程或者线程共享同一块缓存,但毕竟还是只能局限在一台机器上,多台机器做相同的缓存同样是一种资源的浪费,而且命中率也比较低。近年来,随着内存容量的飞速扩张和价格的下降,使用内存缓存开始成为一种可能。

内存缓存技术的产生是基于这样一种思考,即操作系统的一个经典的理论,20%的数据通常在80%的时间内被访问。既然这样,我们的目标就可以集中在这20%的数据中,当这些数据第一次被访问以后就将它放在内存中,再次访问这些数据的时候,只要从内存读取并且赋予它更好的访问级别即可。众所周知,内存的访问速度是非常快的,这样以来我们整个系统的速度就会提高数个重量级。

目前内存缓存技术最杰出的成果就是Memcached,我们这次的研究对象是泰国著名的社交门户。该网站现有会员3000万,每天要承受很大的访问压力。因此需要将用户经常访问的数据缓存起来,以此提高响应速度。

2 Memcached简介与分布式环境配置

Memcached是的一个项目,最早是为LiveJournal服务的,最初为了加速LiveJournal访问速度而开发的,后来被很多大型的网站采用。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。

起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。Memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于Memcached作者对分布式cache的理解和解决方案。Memcached完全可以用到其他地方 比如分布式数据库,分布式计算等领域。

我们的第一步工作就是构建一个分布式系统,注意针对Memcached的特性,我们只能在分布式环境中测试它!目前主要分布存储的方式都是按照一定的方式进行切分,主要是垂直切分(纵向)和水平切分(横向)两种方式,当然,也有两种结合的方式,达到更到的切分粒度。目前采用的是类似Master/Slave 结构,具体情况简化如图1所示,我们可以用三台服务器来模拟。

图1 的类虚拟分布结构

当一台作为主服务器,需要在该服务器上配置Memcached的服务端,并在打开守护进程的同时打开一个内存池。另外的两台电脑做客户端,存放的是缓存数据的key值,其对应关系如图2所示。

图2 memcached的key-value 模型

3 Memcached的简单测试

从技术研究以及Memcached官方的报告来看,php语言对Memcached的支持最好,所以今天的演示代码我们就采用php代码。选择php作为客户端,第一步就要配置它,我们采用直接直接引用Memcached官方过来的php扩展的办法。

当客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了。代码中主要用到4个方法,add方法负责往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;get方法负责从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;replace方法负责用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;delete方法负责删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。

以上虽然只是一个简单应用,但是基本概括了其常用的操作。在的实际应用中,我们把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。需要的时候就直接从内存读取出来,这样就可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。

4 Memcached深度研究

前面曾经提到过20%的数据的问题,这个对于每一个网站来说都是不一样的,所以需要长期地进行日志分析才能决定哪些数据需要直接放到内存里。而Memcached的一个缺点就是没有提供自身日志功能,不过我们可以在数据的读写前对数据的key值进行统计。

我们知道Memcached使用内存管理数据,所以它是易失的,当服务器重启,或者Memcached进程中止,数据便会丢失,所以Memcached不能用来持久保存数据。对于这样的大负载网站显然是不能允许这样的事情发生的,为此我们必须思考一种办法使得Memcached里面的数据能够像数据库一样稳定。可喜的是我们找到了memcachedb,而不用自己开发增加成本。memcachedb故名思义就是 Memcached+bdb,是基于Memcached Socket层和berkeley-db存储层结构的实现,是新浪互动社区技术团队2007年的一项重大的技术成果,现在应用于新浪互动社区多个产品线中,其中包括新浪博客等重头产品。能够实现任意memcache api的调用、数据实时落地以及主辅实时备份。

为什么要选择memcachedb:没有什么特殊的原因,最好的理由就是,在做到最大不牺牲数据读、写性能的前提下,它能够让我们原来存储在memcache里的数据不再遭受系统宕机或者系统掉电而丢失,即使服务器电源爆炸了,只要硬盘还能够正常工作,换到另外一台服务器上,数据依然安然无恙地在硬盘上。安装过程比Memcached稍微复杂一点,经过我们的测试性能相当稳定。

此外,阅读它的源代码发现Memcached有一个很有特色的内存管理方式,为了提高效率,它使用预申请和分组的方式管理内存空间,而并不是每次需要写入数据的时候去malloc,删除数据的时候free一个指针。Memcached使用slab->chunk的组织方式管理内存。这个就是它的效率之所以高的关键了。现在的版本LRU淘汰算法只是在每个SLAB内部使用,为了进一步提高性能,我个人建议采用全局LRU淘汰算法。目前修改的代码编译效果不是很理想,还在努力修改中。

5 结束语

Memcached的横空出世为我们解决高负载互动提供了解决办法。内存缓存技术在门户系统中的应用及其在国内外的扩展,比如memcachedb使得内存缓存有了数据库一样的稳定性。高效和稳定,再加上快速已经给国内外的大型网站带来了质变。国内的sina,sohu和baidu,taobao等无一不使用该技术来为网站加速,应用只能解决暂时的问题,我们将努力改进其现有缺陷,不断进行技术创新,为国内软件技术的发展做出贡献。

参考文献:

[1] 张尧学,史美林,计算机操作系统教程[M]. 清华大学出版社,2003.

[2] 张益新,沈雁编著.算法引论[M]. 国防科技大学出版社.1997.11.

[3] 冯登国. 计算机通信网络安全[M]. 北京:清华大学出版社, 2001.

[4] 单国栋, 戴英侠, 王航. 计算机漏洞分类研究[J]. 计算机工程,2002,(10):11-14.

[5] Matt B. Computer Security: Art and Science. Addison-Wesley Professional.ISBN:0-201-44099-7,2003.

[6] Ross A. Security Engineering: A Guide to Building Dependable Distributed Systems. John Wiley & Sons. ISBN: 0-471-38922-6,2001.

[7] Matt Blaze. 2002 September 15 (Preprint, revised 2003 March 02). Cryptology and Physical Security: Rights Amplification in Master-Keyed Mechanical Locks. IEEE Security and Privacy (March/April 2003).

[8] Computer Emergency Response Team/Coordination Center. 2003. CERT/CC Vulnerability Metric.

[9] Internet Security Systems. 2002 November 18 (Revised). X-Force? Vulnerability Disclosure Guidelines.

[10] Elias Levy. 2001 October 21. Security in an Open Electronic Society. SecurityFocus.

上一篇:虚拟化技术在云计算中的应用初探 下一篇:单点登录(SSO)系统的设计与实现