在系统中使用内存对象缓存系统(上篇)

本文探讨了内存数据库和内存对象缓存系统的基本概念及应用。重点介绍了内存数据库的优势及其实现方式,同时讨论了内存对象缓存系统,如Memcached的工作原理及其在呼叫中心系统中的应用场景。

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 数据安全性的惟一一种解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值