1、Memcached和Redis在高速缓存方面的应用王心妍(西安培华学院,陕西 西安 710000)摘 要:随着互联网的不断发展,各种类型的应用层出不穷,影响网络速度的瓶颈主要集中在访问距离和服务器承载负荷能力方面,内存数据库作为一种优秀的解决方案,得到越来越广泛的应用。本文介绍了两种常用内存数据库,并根据各自的特点分析了他们的应用场景。关键词:内存数据库;Memcached ;Redis1 引言信息时代网络用户以指数方式飞速增长,各国都在积极致力于信息高速公路建设。随着接入网速度的不断提高,主干带宽的不断扩容,传统影响网络速度的因素不断地在减少,然而随着用户规模的不断扩大以及用户需求的不断提高
2、,目前影响网络速度的瓶颈主要集中在访问距离和服务器承载负荷能力方面。网站服务器基础设施的不断改善可以满足日益增大的网站访问量、即时更新的内容和不断提高的用户期望值,但如果采用扩展服务器或者镜像服务器作为解决方案的话,则会增加大量的运行维护工作,并增加较高的运营成本。要让服务器快速响应用户需求并承受越来越大的负荷量,高速缓存服务器Cache不失为一个较好的解决方案。Cache设计简单,性能高效,可以减少网站服务器的内容传输负荷,提高对用户的响应速度,有效地提高网站性能和可扩展性。Cache主要应用在这几种情况下:降低数据库负载,对数据库数据进行缓存;提高Web页面生成速度,对于重复使用的Web页
3、面缓存部分或者全部;提高计算速度,对复杂计算结果缓存。而对于实时响应度要求比较高且性能要求比较高的系统,如电信的业务支撑系统和计费系统等,Cache就会显得力不从心,内存数据库(MDB:Main Memory Database)应运而生,为目前的诸多应用提供了有效方便的缓存解决方案。MDB通过将数据完全加载到内存,在内存中实现对数据的管理,有效地解决了基于磁盘数据库中CPU和磁盘I0之间的主要矛盾,内存中数据读写的速度比磁盘要高出几个数量级,将数据保存在内存中相比从磁盘上访问数据能够极大地提高应用的性能。同时由于内存数据库受到物理内存的限制,在常见的缓存解决方案中往往是磁盘数据库和内存数据库并
4、存,磁盘数据库用于存储可异步处理的数据,内存数据库用于存储必须快速处理、及时响应的数据。本文主要介绍开源内存数据库Memcached和Redis的特性及其应用。2 Memcached2.1 Memcached简介Memcached是一个免费开源的、高性能的、具有分布式内存对象的缓存系统,它通过减轻数据库负载加速动态Web应用。目前全球很多用户都在使用它来构建自己的大负载网站或提高访问量超大网站的响应速度。缓存一般用来保存一些经常存取的对象或数据(例如,浏览器会把经常访问的网页缓存起来),通过缓存来存取对象或数据要比磁盘存取快很多。Memcache把经常存取的对象或数据缓存在内存中,内存中缓存的
5、这些数据通过API的方式被存取,数据就像一张大的Hash表,以key/value对的方式存在。Memcache通过缓存经常被存取的对象或数据,来减轻数据库的压力,提高网站的响应速度,构建速度更快的可扩展的Web应用。许多Web应用都将数据保存到关系数据库管理系统中,应用服务器从中读取数据并在浏览器中显示。而随着数据量的增大、访问的集中,就会出现数据库系统负担加重、数据库响应恶化、网站显示延迟等重大影响。Memcached不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点就是极大的提高了访问获取数据的速度。它的一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数
6、,大幅度降低数据库负载,更好的分配资源,以提高动态Web应用的速度、提高可扩展性。2.2 基本特征Memcached作为高性能的缓存服务器,具有如下特征:2.2.1 协议简单Memcached的协议实现比较简单,使用的是基于文本行的协议,能直接通过telnet在其服务器上存取数据。2.2.2 基于libevent的事件处理lib eve nt是一套利用C开发的程序库,它将B SD系统的kqueue、Linux系统的epoll等事件处理功能封装成一个接口,利用libevent进行异步事件处理,确保即使服务器端的连接数增加也能发挥很好的性能。2.2.3 内置的内存管理方式Memcached有一套自
7、己管理内存的方式,这套管理方式非常高效,所有的数据都保存在它内置的内存中,当存入的数据占满空间时,使用LRU算法自动删除不使用的缓存。Memcached是为缓存系统设计的,因此没有过多考虑数据的永久性问题。2.2.4 互不通信的分布特征各个Memcached服务器之间互相不通信,都是独立的存取数据,不共享任何信息。而通过对客户端的设计,让Memcached具有分布式,可以支持海量缓存和大规模应用。3 Redis3.1 Redis简介Redis(Remote Dictionary Server)是一个基于内存的高性能key/value数据库,与Memcached一样,为了保证效率,数据都是缓存在
8、内存中。最大的区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis的出现,很大程度补偿了Memcached这类键值存储的不足,在部分场合可以对关系数据库起到很好的补充作用。3.2 基本特征Redis在很多方面与Memcaehed具有相似的特征,更多场景是作为Memcaehed的替代出现的,但它又具有更为优秀的面。3.2.1 支持数据的持久化Memcached把数据全部存放在内存之中,服务器重启后数据会消失,而且数据不能超过内存大小;而在Redis中不是所有的数据都一直存储在内存,可以根据需要将内存中
9、的部分数据保存在磁盘中,以保证数据的持久化,服务器遇到重启情况,数据很快可以恢复使用。3.2.2 支持多种数据结构Redis不仅仅支持简单的k/v类型数据,同时还提供list,set,zset,hash等类型的数据。所有的数据类型都具有 push/pop、add/remove、执行服务端的并集、交集等操作,这些操作都是具有原子性的,它还支持各种不同的排序能力。3.2.3 支持主从复制Redis的主从复制实现简单却功能强大,支持多级Master/Slave,一个master支持多个slave连接,slave可以接受其他slave的连接;主从同步时master和slave都是非阻塞的。Redis主
10、从复制可以用来实现数据的持久性,slave作为master的扩展,提供一些read-only的服务,也可以将数据持久化放在slave做,从而提升master性能。4 Memcached与Redis应用分析通过上述分析,可以看到Redis具有比Memcached更加完善的功能,而对应特征的不同,两者应用场景也有所区别。4.1 Memcached应用举例社交网络服务网站比如开心网、人人网、51网等,网页上往往需要引用大量的用户信息、好友信息以及文章信息等,所以跨表或跨库操作会相当多。如果这些功能全部直接操作数据库,则会带来极大的效率损耗和系统负载。Memcached在这样的场景下就会发挥巨大的作用
11、,它采用大内存把这些不变的数据全都缓存起来,当数据修改时就通知缓存过期,这样应用层基本上就可以解决大部分问题了,只有很小一部分请求穿透应用层用到数据库。在Blog和BBS中Memcached也发挥了巨大作用。比如新浪博客需要实时地显示用户点击数和阅读数,而BBS中需要记录的在线人数、在线用户等。这些频繁使用的小数据的处理非常繁琐,无论怎么去设计数据库,都很难避开跨表或者跨库,即使在数据库中增加冗余字段也无法解决这类问题。而Memcached在这样的场景下就会将这些小数据进行缓存,定期持久化就可以了,查询操作一直都在内存中运行。Memcached仅限于缓存数据的应用,如果需要对数据做永久存储,R
12、edis无疑是合适的选择。4.2 Redis应用举例Redis与Memecached相比更多的优势在于高效的读写效率及其丰富的数据类型所带来的快速开发和其作为缓存的安全性。Redis将数据保存在内存中定期刷新到磁盘,以极高的读写效率而备受关注,新浪微博就大规模的使用了Redis来存储用户关系和计数。新浪微博的用户每时每刻都可以发表大量的信息,这样的新信息每天都以百万级,甚至千万级的数据量增加,这就要求提供商不断地增加服务器,而一台服务器可能支撑的数据规模也就是几千万,这样的话,可能每天都要增加服务器来解决新增数据的问题。而服务器的运营和维护费用又特别大,所以可以采用Redis方案来解决。目前新浪微博是Redis全球最大的用户,在新浪有200多台物理机,400多个端口正在运行着Redis,有超4G的数据跑在Redis上来为微博用户提供服务。Redis更适合做简单查询类应用,如韵达快运的查询接口,采用REDIS后,性能提高的不是一点点。不过Redis也不能乱用,需要将数按一定的算法将其压缩以节省内存,同时提高性能。参考文献1徐海华面向应用的内存数据库研究D上海:海师范大学,20082王珊,肖艳芹,刘大为,等内存数据库关键技术研究J计算机应用,2007,10(10).