欢迎各位兄弟 发布技术文章

这里的技术是共享的

discuz 缓存

Discuz!X/缓存机制和使用方法

此页由蓝色于 2011-02-19 13:15:40

Discuz!X的缓存支持五种缓存方式,其优先度分别为:memcache,eaccelerator,xcache,file,sql。前三种是使用第三方的缓存,服务器环境得自己单独配置,只需要config_global.php里配置CONFIG MEMORY一段就好了,关于这一部分的代码解读参考http://wiki.blueidea.com/skins/monobook/external.gif); padding: 0px 17px 0px 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat;" target="_blank">DiscuzX1.5缓存系统流程。


最后的两种是原生支持的,需要config_global.php里配置CONFIG CACHE一段,个人感觉sql的会好一些,因为用的是内存缓存,但不方便查看和开发调试,file是文件缓存,好处是可以随时打开看看,调试方便。


好了,现在来说说怎么使用缓存,如果一个网站有一些数据是不经常变动,但又使用频繁的,就可以用缓存了。比如论坛版块,栏目分类等。如果要增加一个新的缓存数据要怎么办呢?

1.要在\source\function\cache里增加一个缓存文件,定义数据的获得方式和内容。文件名和方法名按照规范来定义,会自动加入缓存机制,后台更新缓存时,都会自动执行,很容易就增加了一个新的数据缓存。

2.手动更新缓存和使用缓存呢,只需参考以下代码

//读缓存,如果没有更新的方法,就需要引入cache库
require_once libfile('function/cache');
//xxxx是你的缓存名
updatecache('xxxx');
//执行多个更新缓存
updatecache(array('xxxx','yyyy')); 
//载入缓存
loadcache('xxxx');
//强制载入更新的缓存
loadcache('xxxx',true);
//使用缓存
print_r($_G['cache']['xxxx']);

来自   http://wiki.blueidea.com/index.php?title=Discuz!X/%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6%E5%92%8C%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95


http://faq.comsenz.com/library/img/arrow.png); background-color: rgb(244, 244, 244); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: 0px 50%; background-repeat: no-repeat no-repeat;">Discuz! 缓存

Discuz! X2.5 的 config_global.php 中有这样一行代码

$_config['cache']['type'] = 'sql';

这就是 Discuz! 内置的缓存方式,如果填写 'sql' 则为使用数据库缓存,填写 'file' 则为使用文件缓存。

http://faq.comsenz.com/library/img/arrow.png); background-color: rgb(244, 244, 244); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: 0px 50%; background-repeat: no-repeat no-repeat;">内存级缓存

缓存层的引入是为了解决MYSQL自身对高并发处理的性能瓶颈,目前产品缓存层采用主流的Key-Value对形式,内存级的缓存产品很多,支持的内存优化接口有 Memcache、eAccelerator、Alternative PHP Cache(APC)、Xcache、Redis 五种,优化系统将会依据当前服务器环境依次选用接口,单服务器环境中推荐使用APC,多服务器环境中推荐使用Redis或Memcache。

数据层是以表为单位的类文件,所有表类都继承discuz_table基类,基类实现缓存操 作的相关函数;理论上所有的数据表均可以缓存,目前产品在六个压力大的数据表内置开启了缓存 机制:用户相关表、回帖、主题、主题和专辑关系、淘贴专辑、用户关注关系。

    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • 用户相关表

缓存表:'common_member', 'count', 'status','profile', 'field_home', 'field_forum'。
UID为缓存KEY。表数据更新时缓存数据会同步更新。

    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • 回帖

以TID为单位,缓存第一页的post数据。表数据更新时缓存数据会同步更新。

    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • 主题

TID为缓存KEY。表数据更新时缓存数据会同步更新。
版块列表默认参数第一页时以 forumdisplay_FID 为缓存KEY,缓存时间内数据不更新。

    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • 主题和专辑关系

以TID为单位,此TID的专辑ID集合,表数据更新时缓存数据会同步更新。

    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • 淘贴专辑

以TID为单位,此TID的专辑集合,缓存时间内数据不更新。

    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • 用户关注关系

以UID为单位,此UID关注用户的关系数据,缓存时间内数据不更新。

http://faq.comsenz.com/library/img/arrow.png); background-color: rgb(244, 244, 244); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: 0px 50%; background-repeat: no-repeat no-repeat;">内存级缓存层实现细节

    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • discuz_table基类中缓存机制的实现
 /** 
* @var string 缓存主键名前缀,为空时表示此表不支持缓存 
*/ 
protected $_pre_cache_key; 

/** 
* @var string 缓存时间,以秒为单位,0表示永久或相关配置文件中的默认值 
*/ 
protected $_cache_ttl; 
    http://faq.comsenz.com/library/plug/img/bullet.gif); color: rgb(68, 68, 68); font-family: 微软雅黑, 宋体, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
  • discuz_table基类中缓存机制的方法
//缓存一个变量到缓存中,如果 KEY已经在则会被覆盖为新值
store_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
//获取指定KEY的缓存数据
fetch_cache($ids, $pre_cache_key = null)
//清除指定KEY的缓存
clear_cache($ids, $pre_cache_key = null)
//更新一个已经存在的KEY,只更新修改的字段
update_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
//批量更新缓存,只更新已经存在KEY的指定修改的字段
update_batch_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)
//重置已经存在的KEY的值
reset_cache($ids, $pre_cache_key = null)
//累加缓存数据中某字段的值
increase_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)

来自 http://my.1qingren.net/network.php?&page=1




禁用缓存
如果是更改css样式是需要重新生成css缓存文件(后台更新缓存)
$_config['output']['tplrefresh'] =1 是每次都会重新生成模块缓存文件
浏览时候都是读取的缓存文件,没法关闭缓存
来自 http://www.discuz.net/thread-2259224-1-1.html
唯物品评历史

关注"唯物品评历史",跟着泪痕春雨先生,读懂历史,看彻人生

打开隐藏二维码