简单的数据缓存技术-1

转载 2004年07月07日 12:33:00
KnightE发在 □-Discuz! 开发交流 里的文章,我觉得很有用,转出来大家看看。

  近来做了一阵子程序性能的优化工作,有个比较有意思的想法,想提出来和大家交流一下。
  Cache是“以空间换时间”策略的典型应用模式,是提高系统性能的一种重要方法。缓存的使用在大访问量的情况下能够极大的减少对数据库操作的次数,明显降低系统负荷提高系统性能。相比页面的缓存,结果集是一种“原始数据”不包含格式信息,数据量相对较小,而且可以再进行格式化,所以显得相当灵活。由于PHP是“一边编译一边执行”的脚本语言,某种程度上也提供了一种相当方便的结果集缓存使用方法——通过动态include相应的数据定义代码段的方式使用缓存。如果在“RamDisk”上建缓存的话,效率应该还可以得到进一步的提升。以下是一小段示例代码,供参考。

<?
// load data with cache
function load_data($id,$cache_lifetime) {

// the return data
$data = array();

// make cache filename
$cache_filename = ‘cache_‘.$id.‘.php‘;

// check cache file‘s last modify time
$cache_filetime = filemtime($cache_filename);

if (time() - $cache_filetime <= $cache_lifetime) {
//** the cache is not expire
include($cache_filename);
} else {
//** the cache is expired

// load data from database
// ...
while ($dbo->nextRecord()) {
// $data[] = ...
}

// format the data as a php file
$data_cache = "<?/r/n";
while (list($key, $val) = each($data)) {
$data_cache .= "/$data[‘$key‘]=array(‘";
$data_cache .= "‘NAME‘=>/"".qoute($val[‘NAME‘])."/","
$data_cache .= "‘VALUE‘=>/"".qoute($val[‘VALUE‘])."/""
$data_cache .= ";);/r/n";
}
$data_cache = "?>/r/n";

// save the data to the cache file
if ($fd = fopen($cache_filename,‘w+‘)) {
fputs($fd,$data_cache);
fclose($fd);
}
}
return $data;
}
?>

适用情况:
1.数据相对比较稳定,主要是读取操作。
2.文件操作要比数据库操作快。
3.复杂数据访问,大数据量访问,密集数据访问,系统数据库负载极重。
4.Web/DB分离结构或者多Web单DB结构。

未经证实的问题:
1.并发访问时对文件的读写是否会引起锁定问题。
2.涉及到的数据文件太多时,性能如何。

扩展思路:
1.生成JavaScript数据定义代码,在客户端调用。
2.还未想到……  

望共同探讨。

缓存

如果你想要让自己庞大的PHP应用有更好的性能表现,采用缓存也是一种很好的方法。现在已经有许多缓存方案可供选择,其中包括:Zend Cache,APC,和Afterburner Cache。

所有这些产品都属于“缓存模块”。当第一次出现对.php文件的请求时,它们会在Web服务器内存中保存PHP的中间代码,此后就用“经过编译”的版本响应后继的请求。这种方法确实能够改善应用的性能,因为它使得磁盘访问量减低到了最少的程度(代码已经读取和解析),代码直接在内存中运行使得服务器响应请求的速度大大提高。当然,缓存模块还会监视PHP源文件的变化,必要时重新缓存页面,从而防止了用户得到的页面仍旧由过时的PHP代码生成。由于缓存模块能够明显地降低服务器的负载、提高PHP应用的响应效率,因此它们非常适合于负载较大的网站使用。

如何选择这些缓存产品
Zend Cache是Zend Technologies公司的商业软件,而Zend Technologies就是前面提到的那个为我们提供PHP引擎和免费Zend Optimizer的公司。Zend Cache确实是名不虚传!对于大型的PHP页面,你可以感觉到第一次运行之后速度就会有所提高,而且服务器也会有更多的可用资源。遗憾的是这个产品并不免费,不过在有些情形下它仍旧是物超所值。

Afterburner Cache是来自Bware Technologies的免费缓存模块,当前这个产品还是Beta版。Afterburner Cache的做法看起来与Zend Cache差不多,但它对性能的改善程度(还)不能与Zend Cache相比,而且它还不能与Zend Optimizer一起工作。

APC是Alternative PHP Cache的缩写,它是来自Community Connect的又一个免费缓存模块。这个产品已经具有足够的稳定性供正式场合使用,而且它看起来也能在很大程度上提高响应请求的速度。

有关压缩

来自Remote Communications的免费Apache模块mod_gzip就具有为支持这类内容编码的浏览器压缩静态Web内容的能力。对于绝大多数静态Web内容,mod_gzip都非常有效。mod_gzip可以方便地编译到Apache里面,也可以作为DSO使用。据Remote communications公司说,mod_gzip也能够压缩来自mod_php、mod_perl等的动态内容。我试了一次又一次,但看来还是不行。我看了许多关于mod_gzip的论坛和文章,看来到了mod_gzip的下一个版本(可能是1.3.14.6f)这个问题有望得到解决。在此之前,我们可以在网站的静态部分使用mod_gzip。

然而有时我们确实蹊要压缩动态内容,所以必须找找其他办法。有一种办法是使用class.gzip_encode.php,这是一个可以用来压缩页面内容的PHP类,具体方法是在PHP脚本的开头和末尾调用该类的某些函数。如果要在网站级实现这个方案,可以从php.ini文件的auto_prepend以及auto_append指令调用这些函数。这种方法虽然有效,但它无疑为高负载的网站带来了更多的开销。关于如何使用这个类的详细说明,请参见它的源代码。它的源代码说明相当完善,作者告诉了你所有你必须知道的事情。

PHP 4.0.4有一个新的输出缓存句柄ob_gzhandler,它与前面的类相似,但用法不同。使用ob_gzhandler时要在php.ini中加入的内容如下:

output_handler = ob_gzhandler ;

这行代码使得PHP激活输出缓存,并压缩它发送出去的所有内容。如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不压缩),语法如下:

php_value output_handler ob_gzhandler

或者是从PHP代码调用,如下所示:

ob_start("ob_gzhandler");

采用输出缓存句柄的方法确实非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape Communicator对压缩图形的支持不佳,因此除非你能够保证所有用户都使用IE浏览器,否则你应该禁止压缩JPEG和GIF图形。一般地,对于所有其他文件,这种压缩都有效,但建议你针对各种浏览器都分别进行测试,特别是当你使用了特殊的插件或者数据查看器时这一点尤其重要。

深度解析数据缓存技术

转自:http://www.yangqiu.cn/sinobeauty/1616327.html 1.缓存概述 ​ 缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数...
  • weixin_35804181
  • weixin_35804181
  • 2018-03-21 17:54:39
  • 96

.Net网站架构设计(四) 缓存技术

一、用Redis 共享IIs 集群的 Session信息。 IIs 集群 Session 会话这么保存? 当然你可以采用传统的方式,让其保存在SateManager服务器,或者缓存到数据中。 用...
  • liming850628
  • liming850628
  • 2016-02-25 13:52:47
  • 1168

简单的数据缓存技术-2

采用 PEAR 来缓冲 PHP 程序PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP 每次都会编译一次脚本。这样的超负...
  • aboutagirl
  • aboutagirl
  • 2004-07-07 12:39:00
  • 784

PHP常用缓存技术的总结

1、全页面静态化缓存:将页面全部生成为HTML静态页面,用户访问时直接访问静态页面,不走PHP服务器的解析流程。此种方式在CMS系统中比较常见,如dedecms。 实现方法:输出缓存 ob_sta...
  • ym_diver
  • ym_diver
  • 2017-07-01 18:23:53
  • 922

简单的数据缓存技术-3

简单的数据缓存技术-3PHP应用程序的性能优化使用PHP编程的最大好处是学习这种编程语言非常容易以及其丰富的库。即使对需要使用的函数不是十分了解,我们也能够猜测出如何完成一个特定的任务。 尽管P...
  • aboutagirl
  • aboutagirl
  • 2004-07-07 12:40:00
  • 865

数据缓存技术及代码详解

1.缓存概述   •为什么使用缓存     – 应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能   • 缓存机制分类介绍     – 应用程序...
  • github_37855556
  • github_37855556
  • 2017-03-29 09:35:34
  • 448

数据库缓存技术文档 缓存 数据库

  • 2010年10月18日 10:32
  • 30KB
  • 下载

ASP.NET 缓存技术分析

缓存功能是大型网站设计一个很重要的部分。由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能。可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大...
  • sundacheng1989
  • sundacheng1989
  • 2013-08-16 14:27:12
  • 11995

.NET 中的缓存技术

.net页面缓存 1,ASPX页面缓存 页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明  这样整个页面的内容都会被缓存,页面中的ASP.NET代码、数据源在缓存期间都不会被...
  • yanguan55
  • yanguan55
  • 2013-01-24 10:43:05
  • 2608

Android数据缓存的实现

我们平常做app的时候,如果是展示型的app,数据通常希望在离线的时候还能加载,这就需要你的app设置缓存了,而有些人的想法是对每一个访问网络的地方进行数据的缓存操作,其实大可不必,你可以在你的网络框...
  • u011692041
  • u011692041
  • 2016-04-14 08:53:31
  • 472
收藏助手
不良信息举报
您举报文章:简单的数据缓存技术-1
举报原因:
原因补充:

(最多只允许输入30个字)