A-A+

浅谈Discuz的缓存机制

2019年07月18日 我爱编程 评论 1 条

Discuz因为其数据量的庞大以及数据更新的高频率,而催生了两个最为牛逼的东西:缓存技术和数据库的设计,这两块技术都是很值得研究和学习的地方,研究透了就可以举一反三,触类旁通,融为己用,应用到自己的项目中去,最近在研究Discuz的缓存技术,看之前我并没有直接从代码入手,而是先查了一些资料,看了一些别人的分析,然后再从代码层面去研究,到现在也有了自己的一些理解,所以下面就谈谈discuz的缓存技术.

但凡研究一个东西,个人认为首先得弄懂它的核心思想,思想通了,技术上的实现就是单纯的技术问题了,也大同小异,基本差不多,也才能真正举一反三,融为己用,discuz的缓存机制简单的说就是将一些重复操作的结果集保存下来,以后再收到同样的操作时直接从缓存的结果集中取出数据来使用而不用再去重复执行相同的操作,这样做的好处就是减少一些重复性的解析或者SQL查询之类的动作,从而有效的缓解服务器的压力,discuz的缓存分为三种:模板缓存,文件缓存和数据缓存。

一、模板缓存

discuz模板缓存的大体思路是这样的:解析模板的时候程序会去检查该模板的缓存文件(文件名为:模板id+模板名+.tpl.php)是否存在,如果不存在会直接解析该模板并生成一个缓存文件,而该缓存文件已经是经过discuz模板引擎解析过的文件,文件中的语言标识已经全部被替换成标准的php语句。当下次的请求再次执行到这个模板时,在缓存文件已经存在的情况下,程序会去检查模板文件与缓存文件的更新时间,如果模板文件没有更新则直接调用缓存文件,这样的好处是减少重复解析模板的过程,而discuz模板的解析是用正则表达式经过复杂的替换操作,然后把那些语言标记都替换成标准的php语句,这个过程是比较耗时间的,所以经过这么缓存之后无疑对服务器压力的缓解有着很大帮助。

二、文件缓存

discuz的文件缓存相对比较简单,简单的说就是把一些经常用到的,但是更新不是很频繁的数据缓存在一个文件中,比如一些配置参数还有一些设置等,在config\config_global.php中有这么一个配置:$_config['cache']['type'] = 'sql',//缓存文件类型,file-文件缓存,sql-数据库缓存。当这个配置改成file时,discuz生成的缓存将通过方法写入文件中,文件缓存存储在data\cache目录下,使用文件缓存的好处是当你的服务器存在MySQL压力较大时,可以通过file的缓存机制来缓解MySQL的压力,这种缓存机制是用服务器的IO来换取MySQL的读写频率,降低MySQL的压力,程序在调用的时候直接引入缓存文件即可,这里就不再赘述,具体实现的代码就不附上了。

三、数据缓存

数据缓存和模板缓存一样的经典,前不久发现以前做的一个项目在访问的人比较多时,就显得非常慢,后来走查代码发现在整个程序的入口文件home.php中调用了接口并有两次的switch判断,于是就想把这部分缓存起来,刚开始时想用文件缓存的方式缓存,但是后来老大说这样缓存的话在前端有两台服务器的时候就有可能出现文件生成或写入失败的情况,于是也就放弃了文件缓存的方式。最后采用了discuz的数据缓存。数据缓存用了两个方法:loadcache,save_syscache。loadcache取缓存数据,并存放在$_G['cache'][$cname]中如果为空则调用save_syscache写入缓存,实质是写入common_syscache表,而如果不为空,则也调用save_syscache清除缓存,再写入缓存,从而实现缓存的更新。这样home.php中的接口的调用就没必要了,转为读取缓存中的数据即可,接着再把那两个switch判断转移到具体的模块下面并改为数组的方式来实现,避免了每个模块通过入口文件的时候不管用到用不到都得执行的弊端。完了之后速度明显快了很多,运行很顺畅。这是第一次真正开始接触缓存并用到了实践中,很有成就感,很开心。

其实数据缓存还有一些东西没整明白,虽然会用了,但我还会继续研究,真正做到透彻。discuz的缓存很牛逼,还有数据表的设计.

1 条留言  访客:0 条  博主:1 条

  1. babylove

给我留言

Copyright © 四季博客 保留所有权利.   Theme  Ality

用户登录