最基本的cache

|

摘要:本文试图说服你使用不到10行代码的缓存提高你的web程序效率。

如果你已经写了一段时间的web应用,而且它们越来越大的时候,你就会注意到性能是个问题。当我们假设人工要比机器贵(在正规的公司,这通常是事实),作为工程师,我们就必须考虑到优化程序的效率。

在我的经历中,缓存(cache)往往比任何其他方式更能够轻易而有效地提高应用的性能。

当我们习惯把所有的数据放到数据库中的时候,我们通常假设数据库管理系统DBMS可以应对我们的要求。当你的应用因为访问量的不断增加而变得越来越迟缓的时候,90%的情况你会发现是因为数据库存在瓶颈。是的,MySQL非常的快,但这不是完全依赖它的很好的理由。你会发现,在脚本语言和数据库之间建立一个缓存机制是十分必要的。

事实上,我建议把这种三层结构作为一种最基本的web应用的架构范例进行推广,即“业务逻辑-缓存-数据库管理系统”。这要比华丽的“表达-业务逻辑-数据库抽象层-数据库管理系统”实用至少一千倍。(我不想在这里和一群在学校或是臃肿的大型跨国企业里被惯坏的孩子争论表达和业务逻辑分离的必要性,因为这样的争论既浪费时间也无法提高程序的效率。)

很多人认为建立cache系统是十分复杂和繁琐的(例如:至少需要消耗额外的50%的时间),这种谬误导致Internet上大部分开源的代码都是低效的。事实上这只需要1分钟,外加对磁盘至少一个目录(例如: /tmp)读写的权限。

在你的数据库查询语句附近加上这样的代码:

$array = unserialize(trim(file_get_contents ('/tmp/foo')));
If ($array === false) {
	//你原来的代码,通常是从数据库中获得一个结果集放在数组里
	$result = mysql_query(‘SELECT * FROM table’);
	$array = array();
	while ($row = mysql_fetch_array($result)) {
		$array[] = $row;
	}
	cache('foo', $array);
}
function cache($file, $data) {
   if ($handle = fopen('/tmp/' . $file, 'a')) {
	   fwrite($handle, serialize($data));
	   fclose($handle);
	   return true;
   }
   return false;
}

这段程序有很多bug(比如你不能保存false到cache里),我只是想尽可能地展示一个cache能够简单到不到10行代码。你可以根据自己的需要修补和增加一些功能,但是我不想在这里涉及更复杂的东西了。

通过以上这个例子,你可以做到节约大部分访问数据库的开销。当然,为此付出的代价就是你的数据不再是动态的了。你需要问问自己这里或者那里是否真的需要完全动态(实时)的数据,据我所知,大部分数据都是几个小时甚至几天都不会被更改一次的。

我想我在有时间的时候,可以稍微改动一下,把它变成一个支持TTL的cache,但是今天太困了。

可以用cache_lite (

可以用cache_lite ( http://rainx.phpmore.com/manual/cache_lite.html ) 进行类似的cache ,他提供内建的ttl支持, 还有lock和文件md5 check等功能,是个不错的东东(虽然我也不怎么用它,hia hia hia ).....

喜欢这句话: (我不

喜欢这句话:

(我不想在这里和一群在学校或是臃肿的大型跨国企业里被惯坏的孩子争论表达和业务逻辑分离的必要性,因为这样的争论既浪费时间也无法提高程序的效率。)

不过作cache最大的问题是更新和读写锁的问题。
不知道为兄有什么见解。

欢迎交流:http://spaces.msn.com/vayava

纬度不够多。。。做pr

纬度不够多。。。做presentation的话。。写不了几个slides啊。。

我从来不用PEAR里的东

我从来不用PEAR里的东东。看看apear就知道没救了。;-)

不着急,同学,慢慢

不着急,同学,慢慢来 ^^

apear,当你换个马甲我

apear,当你换个马甲我就认不出你了。btw,四维MSP我准备当毕业论文写呢,还要申请阿凡提奖金!

阿凡提奖金已经被名

阿凡提奖金已经被名花有主了

发表新评论

此内容将保密,不会被其他人看见。
  • 允许 HTML标签: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h3> <pre> <blockquote>
  • 行和段被自动切分。
  • You can use BBCode tags in the text, URLs will be automatically converted to links
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
更多格式化选项信息