Discuz!的Memcache缓存实现配置方法

前言:

  在PHP+MySQL架构的站点中,本文重点从MySQL的角度去分析如何使Discuz!论坛(或者类似的PHP+MySQL架构的程序)应对大访问量。同时给出一些使用Memcache去减轻MySQL压力的建议。其中很多数据是个人测试的结果,如有不同意见,敬请留言告之。

  系统分析:

  单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困难的事情。按照这个数据也就是说一个单MySQL服务器的论坛来说可以跑到2千万PV是不成问题的,我相信国内绝大部分的论坛都不可能做到每天2千万的PV,但实际情况并不是如此。当论坛PV超过百万的时候一台WEB早已经不堪重负了。

  就我手头的一些数据显示,目前的Discuz!论坛的基本服务器架构是前面Squid顶着,后面才是一台DB在撑着。这种架构中,web服务器压力增大可以通过并行增加服务器解决,而MySQL压力却无处释放,在不考虑MySQL官方服务的情况下,我们通过合理的利用Memcache是可以达到减轻MySQL服务器负载的。

  可能会有朋友说我们可以对数据表进行分表(注:此处分表是指通过PHP程序去分表,比如pw,dv的分表)处理,但是当前的情况是一台DB服务器已经不能支撑当前的数据处理了,通过PHP对MySQL进行的分表依然不能减轻MySQL的负载。(注:本段文字针对已经成型的系统,如果是独立开发的系统在架构前期就进行数据的同步分区还是不错的。)

  还可能有朋友会说利用MySQL的主从构架,如果你提出这个问题,我就很明确的告诉你,回去看看手册吧。在Mysql Master/Slave 模式中,Slave主要是来备份数据的,只有当Master出现故障时,Slave才会接过Master的服务,对外部请求进行处理,直到Master恢复正常。就是说:在Master/Slave中,要么是Master在服务,要么是Slave在服务,不会Master/Slave同时提供服务。使用MySQL主从依然不能有效的降低MySQL的负载。

  或许你又会问我为什么不使用MySQL集群(MySQL Cluster),那可是白花花的银子啊,同等金钱的付出下,获得最大的收益才是王道。PS:说句题外话,MySQL手册中将MySQL集群解释为MySQL簇,不习惯。

  其实在MySQL5.1中的MySQL分区(MySQL Partition)是个很好的东西,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为单独的表。我认为这个才是当前情况下,最积极有效的降低MySQL负载的解决方法之一。但是遗憾的是,这种MySQL分区的方式我个人没有使用过的经历,也不见有相当充分的案例表明它是稳定的或者不稳定的。所以我还在徘徊中。如果你知道,请麻烦告之!有朋友说腾讯是在用MySQL分区,但是遗憾的是我没有得到确切的数据。

  好了分析总结了这么多种降低MySQL负载的方式之后,在用户环境需求等特定条件下,我得出结论在当前情况下,缓解Discuz!论坛的MySQL负载比较有效的方法就是使用Memcache!

  使用Memcache的理由:

  1.Web Server(Lighttpd、Nginx据说都比Apache效率高好多,大家可以试用下)对CPU要求高,对内存要求低;而Memcached Server是对CPU要求低,对内存要求高,所以可以搭配使用。在对前端的Web Server上安装Memcached Server是可行的。

  2.金钱金钱金钱,最少的付出,获得最大的收益。

  3.简单简单简单,对于一个架构合理的系统来说,添加Memcache的支持可能只是一个批量处理文件的过程

  Discuz!使用Memcache

  1.在config.inc.php中增加

PHP代码
$memcachehost = '127.0.0.1'; 
$memcacheport = 11211; 
$memcachelife = 60; 
  2.在include/common.inc.php中

PHP代码
$mem = new Memcache; 
$mem->connect($memcachehost, $memcacheport); 
  3.修改include/db_mysql.class.php中的fetch_array、query这两个方法,并添加query_mysql方法,代码如下:

PHP代码
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查询的代码由

PHP代码
$db->query( 
  修改为

PHP代码
$db->query_memcache( 
  注意并将

PHP代码
while($post = $db->fetch_array($query)) { 
  修改为

PHP代码
foreach($query as $post) { 
  没有while的$db->fetch_array可以不用修改。

  下面代码有用得着的就拿去:

PHP代码
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.完成了,测试吧!

时间: 2024-10-21 13:52:35

Discuz!的Memcache缓存实现配置方法的相关文章

discuz x1.5 伪静态的配置方法(iis,apache)

discuz x1.5 伪静态的配置方法(iis,apache) 如是Apache服务器,操作如下: 建立.htaccess文件,在该文件里面写入如下伪静态规则: 复制代码 代码如下: # 将 RewriteEngine 模式打开 RewriteEngine On # 修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 / RewriteBase /discuzxx # Rewrite 系统规则请勿修改 RewriteCond %{QUERY

Discuz!下Memcache缓存实现方法_php技巧

前言:在PHP+MySQL架构的站点中,本文重点从MySQL的角度去分析如何使Discuz!论坛(或者类似的PHP+MySQL架构的程序)应对大访问量.同时给出一些使用Memcache去减轻MySQL压力的建议.其中很多数据是个人测试的结果,如有不同意见,敬请留言告之.另外由于个人思维的问题,行文比较跳跃,特此声明! 系统分析:单纯的从MySQL的角度出发,单台MySQL的数据库负载到每天上亿次的操作(每秒大概1100次MySQL操作,然后乘以86400)应该不是非常困难的事情.按照这个数据也就

php smarty高级缓存的配置方法详解

对于访问流量比较大.数据不需要及时更新的网站而言,充分使用缓存技术可以有效的减轻服务器压力.smarty模板引擎中也内置了功能强大的缓存技术,只需要简单配置即可使用smarty的缓存功能.开启smarty高级缓存只需要在smarty的配置文件中设置好缓存存放的目录.开启缓存状态.设定缓存的有效期即可,具体使用方法如下:  代码如下 复制代码 /***********smarty.php***********/ <?php  include ('./smarty/Smarty.class.php'

Linux服务器中对于Memcache的安装配置方法_Linux

下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz 另外,memcache用到了libevent这个库用于socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.3.(如果你的系统已经安装了libevent,可以不用安装) 官网:http://www.monkey.org/~provos/libevent/ 下载:http://www.monkey.org/~provos/lib

php扩展memcached和memcache的安装配置方法_Linux

php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,memcached是比较新的开发库,php安装这两个扩展中的任意一个后就可以在编写php代码时使用的memcached缓存数据,达到缓存php执行的结果 1.安装memcachetar -zxvf memcache-2.2.7.tgz cd memcache-2.2.7 /usr/local/php/bin/phpize ./configure –with-php-config=/usr/local/

Python的Flask框架使用Redis做数据缓存的配置方法_Redis

Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统.会把数据读入内存中提高存取效率.Redis性能极高能支持超过100K+每秒的读写频率,还支持通知key过期等等特性,所以及其适合做缓存. 下载安装 根据redis中文网使用wget下载压缩包 $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz $ tar xzf redis-3.0.5.tar.gz $ cd redis-3.0.5 $ make 二进制文

WIN下Nginx缓存加速配置方法_win服务器

Nginx.conf 程序代码 复制代码 代码如下: worker_processes 1; events { worker_connections 1024; } http { include mime.types; include proxy.conf; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; loc

emlog中使用memcache缓存配置修改方法

这次只是简单的HACK emlog cache程序,使用memcache缓存,毕竟memcache缓存在内存, 文件缓存在硬盘(要看I/O的性能),一般来说内存的性能大于硬盘,所以一般来说memcache缓存优于文件缓存. memcache相对于文件缓存的优点: 1.读写性能优异,特别是高并发时和文件缓存比有明显优势. 2.memcached组建支持集群,并且是自动管理负载均衡 注意:memcache的原理是内存分块,单个item大于1M的数据存memcache和读取速度可能有点慢. 具体的情况

php操作memcache缓存方法分享

  一般来说,如果并发量不大的情况,使不使用缓存技术并没有什么影响,但如果高并发的情况,使用缓存技术就显得很重要了,可以很好的减轻数据库和服务器的压力,当然解决高并发的技术有很多,这里只是以缓存的角度来说明使用memcache的便捷性和方便性, 使用memcache的前提是需要在服务端先配置好memcahche的环境!确认memcahce可以正常连接之后就可以在程序使用了! ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23