Discuz! 上如何使用memcached

By | 2010年9月9日

最近公司有个沉淀了快三年的论坛速度越来越来慢,posts表大概有1300多万的数据,个别回帖更是达到十多万,论坛尤其是在老板访问的时候更慢。

所以我们想了并试了一些方法,都没什么理想的结果,包括分表等。最后把方向锁定到memcached上,因为Dz并没有自带memcached模块(不知道是开发麻烦呢,还是想赚服务费呢),所以只有自己动手了。

搜索了一些网上大侠们的文档,有一篇是按照查询语句Hash之后做key,把数据结果集放到memcached上,我亲手试了一下,memcached确实让论坛快的多,但问题也来了,如何更新缓存?定个失效时间的话用户发完帖子了却看不到自己的帖子,因为查询的Hash是不变的,缓存未清空。

前一段时间听说phpbb3论坛支持memcached了,不如看看人家是怎么做的,经过一晚的研究,终于搞明白了个大概,特写此文备忘。

比如有如下查询语句:

$query = “SELECT * FROM cdb_posts WHERE tid=80”;

我们用md5得到这个查询要放入memcached的key,

$key = md5($query);

同时我们通过正则得到此查询相关的表:cdb_posts,然后将此查询和记录到此表的数组中;

$arr_cdb_post = Mem->get(‘cdb_posts’);

if($arr_cdb_post === FALSE){

$arr_cdb_post = array();

}

$arr_cdb_post[$key] = TRUE;

Mem->set(‘cdb_posts’, $arr_cdb_post);

$result = $db->get_result($query);

Mem->set(‘sql_’.$key, $result);

这样,当更新了cdb_posts 表的时候,只要通过从memcached中读取出有多少查询就可以了,然后依次删除。

发表评论

电子邮件地址不会被公开。 必填项已用*标注