在Computer News上看到一篇文章,Digg.com的应用也全部是基于LAMP构建的,同时也采用了一些优化工具,按图索骥找到 memcached,是 Danga Interactive 公司开发的一个数据库负载平衡软件,其工作原理是:

首先,在不同的机器上运行 memcached 软件(作为Daemon)。运行的过程很简单,只需要一行命令:

# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211

-d 表示以Daemon方式运行,-m 2048 表示使用2GB的内存,-l 10.0.0.40 表示监听IP 10.0.0.40,而-p 11211 表示监听的端口。

其次,在应用程序中进行配置,在进行任何的数据库查询之前,先检查memcached。如果memcached没有返回任何对象,再连接到数据库,获取需要的数据,然后把它交给memcached缓存起来。

下面是一个基于Perl的示例:

sub get_foo_object {
   my $foo_id = int(shift);
   my $obj = $::MemCache->get("foo:$foo_id");
   return $obj if $obj;
 
   $obj = $::db->selectrow_hashref("SELECT .... FROM foo f, bar b ".
                                   "WHERE ... AND f.fooid=$foo_id");
   $::MemCache->set("foo:$foo_id", $obj);
   return $obj;
}

如果访问数据库的代码写的很精炼,那么不需要添加很多类似上述的代码,只需要把一些极大增加数据库负载的查询运行一下就可以了。

然后系统会把这些查询的结果作为索引保存,以后只要告诉 memcached要查询的内容,它就会返回给你相应的值,由于有多个服务器的 memcached Daemon 支持,可以做到负载平衡。如果一台机器Down了,memcached还会把它的工作自动转移到其它服务器上。

更多的信息,可以参考 memcached 的官方文档。先保存下来,以后偶在慢慢研究:

http://danga.com/memcached/