文:阿蜜果
日期:2011-2-14
1、概念
近年来,内存容量不断提高,价格不断下跌,操作系统已经可以支持更大的地址空间,充分利用技术提升系统性能成为一个热点。
可从数据库方面来考虑,此种方案可使用“内存数据库”,另一种方案是使用“内存对象缓存系统”,将某些量小、使用次数多的数据以key/value的方式保存在内存对象缓存系统中,减少数据库查询访问带来的性能下降。
在本文中,主要讲述后者,但在本章也对“内存数据库”的概念进行说明。
1.1 内存数据库
内存数据库,就是将数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。
在数据库技术中,目前主要使用两种方法来使用大量的内存:
1) 在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问。
2) 使用内存数据库技术(也叫主存数据库)技术,也就是干脆重新设计一种数据库管理系统,对查询处理、并发控制和恢复的算法和数据结构进行重新设计,以更有效的使用CPU周期和内存,这种技术近乎把整个数据库放进内存中,因而产生一种根本性的变化。
1.2 内存对象缓存系统
内存对象缓存系统用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
常用的是Memcached 是一个高性能的分布式内存对象缓存系统,它基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。
2、应用场景
Memcached一般与数据库系统配合使用,它用于存储一些经常需要读取的数据,从来达到提高性能的目的。
下面讲几个在呼叫中心系统中的应用实例。
2.1 任务可执行性检查
例如,外呼任务需要在指定“任务开始时间”和“任务结束时间”中运行,并且在“启用”状态才能运行,而且单个外呼任务的进程需要通过查询数据库定时检查(例如:1分钟)该任务是继续运行,还是终止运行。当多个外呼任务并行运行时,这种查询会给系统增加负担。
若使用内存对象缓存系统,将每个任务的状态信息以key/value对的方式存储在Memcached的“任务信息表”中(key=任务id,value:是否可运行标志),在插入任务时,在Memcached的“任务状态表”中插入一条数据;当“任务开始时间”和“任务结束时间”或“状态”发生改变时,根据key对应改变Memcached的“任务信息表”的value值。在外呼任务进行中,查询任务是否可运行时不再需要查询数据库,一般情况下只需要查询Memcached即可,从而减少了对数据库的访问。
2.2 日程检查
在呼叫中心路由时,有时候需要提供根据日程进行路由的功能,例如满足某个日程(例如:每年的“10月1日00:00:00”到“10月7日23:59:59”的日程)时才路由到A中继。一个日程可以对应多个条目,若在路由前需要要验证当前时间是否满足日程,那对应需要查询两表的信息,还需要是否满足日程条件。当并发很多个用户进行呼叫时,这种检查会给系统增加很大的负荷,在此处也可以使用内存对象缓存系统来解决问题。
开发定时触发(1分钟执行一次)程序去日程表和日程条目表中查询多条信息,将当前时间与某个日程比较,将其存入Memcached中的“日程表”中,key为日程键,value为当前时间是否在当前日程内的标志。
路由程序根据日程键检查Memcached中的“日程表”,若满足某个日程,则路由到A中继,基本不再需要针对日程对数据库进行查询。
3、应用禁忌
3.1 不要将Memcached当数据库用
Memcached 的首要目的就是加快数据的响应时间,否则数据从其他数据源构建或恢复需要很长时间。一个典型的例子就是从一个数据库中恢复信息,特别是在信息显示给用户前 需要对信息进行格式化或处理的时候。Memcached 被设计用来将信息存储在内存中以避免每次在数据需要恢复时重复执行相同的任务。
切不可将 Memcached 用作运行应用程序所需信息的惟一信息源;数据应总是可以从其他信息源获取。此外,要记住 Memcached 只是一个键/值的存储。不能在数据上执行查询,或者对内容进行迭代来提取信息。
3.2 不要使用Memcached存储大批量数据
首先Memcached空间大小不算大,而且主要用于缓存,所以不应该在Memcached中存储大批量数据。若在Memcached中按照一定格式存储数据表的行数据,而且表的数据量又很大,首先空间不允许,而且查询非常麻烦,此类数据适合保存在数据库中。
3.2 Memcached并不安全
为了确保最佳性能,Memcached 并未提供任何形式的安全性,没有身份验证,也没有加密。这意味着对 memcached 服务器的访问应该这么处理:一是通过将它们放到应用程序部署环境相同的私有侧,二是如果安全性是必须的,那么就使用 UNIX® socket 并只允许当前主机上的应用程序访问此 Memcached 服务器。
这多少牺牲了一些灵活性和弹性,以及跨网络上的多台机器共享 RAM 缓存的能力,但这是在目前的情况下确保 memcached 数据安全性的惟一一种解决方案。
4、附录
《常用内存数据库介绍》:
http://www.360doc.com/content/10/1202/16/3196411_74404034.shtml
《内存数据库_百度百科》:
http://baike.baidu.com/view/1210875.htm
《memcached_百度百科》:
http://baike.baidu.com/view/794242.htm
《使用memcached提升站点性能》:
http://www.oschina.net/bbs/thread/11008
posted on 2011-02-15 12:42
阿蜜果 阅读(2656)
评论(0) 编辑 收藏 所属分类:
Java 、
解决方案