Discuz!的Memcache缓存实现
利用自动转存功能,实现存款的连续增值。 #生活技巧# #财务管理技巧# #定期存款#
Discuz!的Memcache缓存实现
单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困难的事情。按照这个数据也就是说一个单MySQL服务器的论坛来说可以跑到2千万PV是不成问题的,但实际情况并不是如此。当论坛PV超过百万的时候一台WEB早已经不堪重负了。
目前的Discuz!论坛的基本服务器架构是前面Squid顶着,后面才是一台DB在撑着。这种架构中,web服务器压力增大可以通过并行增加服务器解决,而MySQL压力却无处释放,我们可以通过利用Memcache来减轻MySQL服务器负载。
可能会有朋友说我们可以对数据表进行分表(注:此处分表是指通过PHP程序去分表,比如pw,dv的分表)处理,但是当前的情况是一台DB服务器已经不能支撑当前的数据处理了,通过PHP对MySQL进行的分表依然不能减轻MySQL的负载。(针对已经成型的系统,如果是独立开发的系统在架构前期就进行数据的同步分区还是不错的。)
其实在MySQL5.1中的MySQL分区(MySQL Partition)是个很好的东西,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为单独的表。我认为这个才是当前情况下,最积极有效的降低MySQL负载的解决方法之一。
分析各种降低MySQL负载的方式之后,还是来谈谈如何利用Memcache缓解Discuz!论坛的MySQL负载
使用Memcache的理由: 1.Web Server(Lighttpd、Nginx据说都比Apache效率高好多,大家可以试用下)对CPU要求高,对内存要求低;而Memcached Server是对CPU要求低,对内存要求高,所以可以搭配使用。在对前端的Web Server上安装Memcached Server是可行的。 2.最少的金钱付出,获得最大的收益。 3.构架简单,对于一个架构合理的系统来说,添加Memcache的支持可能只是一个批量处理文件的过程
Discuz!使用Memcache 1.在config.inc.php中增加
$memcachehost = '127.0.0.1'; $memcacheport = 11211; $memcachelife = 60;
2.在include/common.inc.php中
$mem = new Memcache; $mem->connect($memcachehost, $memcacheport);
3.修改include/db_mysql.class.php中的fetch_array、query这两个方法,并添加query_mysql方法,代码如下:
function fetch_array($query, $result_type = MYSQL_ASSOC) { return is_resource($query) ? mysql_fetch_array($query, $result_type) : $query[0]; }
function query_memcache($sql, $type = '') { global $mem,$memcachelife;
$key = md5($sql); if(!($query = $mem->get($key))) { $query = $this->query($sql, $type); while($item = $this->fetch_array($query)) { $res[] = $item; } $query = $res; $mem->set($key, $query , 0, $memcachelife); } return $query; }
function query($sql, $type = '') { global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes;
$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ? 'mysql_unbuffered_query' : 'mysql_query'; if(!($query = $func($sql, $this->link)) && $type != 'SILENT') { $this->halt('MySQL Query Error', $sql); }
if(substr($sql, 0, 6) == 'SELECT') { echo '<font color="red">Cache SQL</font>:<font color="green">'.$sql.'</font><br /><br />'; } else { echo '<font color="red">Flash SQL</font>:<font color="green">'.$sql.'</font><br /><br />'; }
$this->querynum++; return $query; }
4.将需要使用Memcache缓存的SQL查询的代码由
$db->query( 修改为
$db->query_memcache( 注意并将
while($post = $db->fetch_array($query)) { 修改为
foreach($query as $post) { 没有while的$db->fetch_array可以不用修改。
下面代码有用得着的就拿去:
preg_replace("/while/([$](/w+)/s*/=/s*[$]db->fetch_array/([$]query/)/)/is", "foreach(/$query as /$//1)", $file); 回头放出个小工具批量替换下就可以了。 在EditPlus中可以这样替换:while/([$](.*) = [$]db->fetch_array/([$]query/)/)替换为foreach($query as $/1)
5.完成了,测试吧!~
网址:Discuz!的Memcache缓存实现 https://www.yuejiaxmz.com/news/view/320840
相关内容
【育儿】超级详细的21种辅食的做法,妈妈们快学起来给宝宝们做着吃吧~宝宝辅食99款,再也不用为宝宝的食谱发愁了!(4~24个月全) ...
discuz二次开发之后导航无法高亮 $mnid == $nav[navid]解决办法(转)
妈妈们还在为宝宝辅食发愁吗?这两道辅食简单学
利用AOP实现一个简单的缓存存储、清除的工具
www.ibaoji.com
0731xair.com
缓存清理工具
Media Encoder怎么清理缓存? me清理并更改缓存位置的技巧
python中缓存模块的一些用法