对象缓存用于存储会被应用再用到的对象。这些对象通常来自数据库,或由计算或应用操作生成。这些对象几乎都是有序对象,会被排列或组编成有序的格式,以便最小化内存占用量。在获取这些对象时,它们的排序会被打乱或解编,以转换成原始的数据类型。所谓组编,就是把对象的内存表示形式转换成字节流或字节序列进程,以便存储或传输。所谓解编,就是把字节流表示的对象解码成原始的对象格式的进程。如果使用了对象缓存,应用必须注意到它们,并且实现操作缓存的方法。
操作缓存的基本方法包括把数据加人缓存、从缓存中获取数据以及更新数据。通常在缓存中添加数据叫做set,从缓存中获取数据叫做get,更新数据是replace。许多程序设计语言对最流行的缓存都已经有内置的支持。memcached是当前最常用的缓存之一。它“本质上是一种高性能的分布式内存对象缓存系统,但目的在于通过减轻数据库的负载来加速动态的Web应用”。这种特殊的缓存使用了非常快的无阻塞网络输入输出(IO),它自身具备防止内存分片的slab分配器、可以确保分配是的,即不论数据多少都能够在常数时间内进行计算。
正如在memcached的描述中所说的,它主要是通过减少对数据库的请求,从而加速了Web应用。这种方法是合理的,因为数据库几乎总是应用层中获取数据最慢的设备。在关系数据库管理系统中,实现ACID(原子性、一致性、隔离性、持久性)属性的额外支出是很高的,尤其是要从硬盘读写数据时。但在某些情况下,在系统的其他层之间使用对象缓存层,也是完全正常和明智的。
在一个典型的两层或者三层架构中,放置对象缓存最好的方法是把它放在数据库层之前。正如前面提到过的,这是因为数据库层通常是整体执行速度最慢的层,也通常是扩展最贵的一层。其中有一个Web服务器层、一个应用服务器层和一个数据库层。这里不止有一个对象缓存,而是有两个。一个对象缓存位于应用服务器与数据库层之间,另一个位于Web服务器与应用服务器之间。如果应用服务器要执行大量可缓存的计算或操作,那么这种设计是很合理的。这样可以使应用服务器不必总是重复计算相同的数据,而是可以把结果缓存起来,从而减轻了应用服务器的负载。与数据库的情况相似,这个缓存层可以在不添加硬件的情况下,帮助应用服务器层扩展。缓存的对象很可能是来自数据库或应用服务器的完整数据集的子集。例如,Web服务器上的应用代码可能会利用缓存存放用户权限对象,但是不会存放交易金额,因为用户权限不经常改变且会被经常访问,而每个交易的交易金额可能各不同且只会被访问一次。
数据库的ACID属性
原子性、一致性、隔离性、持久性(ACID)是数据库管理系统采用的属性,以确保交易是完全可靠的。
原子性是数据库管理系统的属性,可以确保一个交易的所有任务都被完全执行了,或者整个交易都被回退了。硬件或软件的故障不会造成交易只完成了一半。
一致性是确保交易前和交易后数据库保持稳定状态的属性。如果一个交易成功了,它会把数据库从一个有效状态转换到另一个符合一定规则的有效状态。
隔离性是在一个交易操作数据时,防止另一个交易访问它的属性。大多数数据库管理系统都采用数据库锁来确保隔离性。
持久性这个属性指的是在系统把交易标记为成功后,交易就会保持为完成的、不会回退的。所有的一致性检查必须在交易被认为是完成了之前完成。
如果你在网站建设数据库或应用服务器中有经常被访问但却不经常更新的数据,那么使用对象缓存就非常合理。要减少负载,首先查看的就是数据库,因为它通常是最慢也是最贵的一层。但除此之外,还要考虑一下系统中的其他层或池,看看哪里需要对象缓存。另一个可能需要对象缓存的地方是集中的会话管理缓存。如果你使用了会话数据,我们建议你首先尽可能地减少会话数据。如果你可以避免使用会话,那么就根本不要采用它们,因为它们在基础设施和架构方面,实现成本都很高。如果你不能避免使用会话,我们建议你考虑集中的会话管理系统,这样可以把请求发送到任何一个Web服务器上,会话可以从一个服务器转移到另一个服务器上,不会造成任何干扰。这样通过一个负载均衡的解决方案,你就能够更有效地利用Web服务器,而当发生故障时,也可以以最小的干扰,把用户从一台服务器上转移到另一台服务器上。你可以继续检查自己的应用,找到更多可以应用对象缓存的地方。
>>> 查看《网站对象缓存》更多相关资讯 <<<
本文地址:http://www.phpweb.com.cn/news/html/3898.html