闲谈关于discuz内核缓存机制
Discuz! 缓存
Discuz! X2.5 的 config_global.php 中有这样一行代码
1 | $_config[ 'cache' ][ 'type' ] = 'sql' ; |
这就是 Discuz! 内置的缓存方式,如果填写 'sql' 则为使用数据库缓存,填写 'file' 则为使用文件缓存。
内存级缓存
缓存层的引入是为了解决MYSQL自身对高并发处理的性能瓶颈,目前产品缓存层采用主流的Key-Value对形式,内存级的缓存产品很多,支持的内存优化接口有 Memcache、eAccelerator、Alternative PHP Cache(APC)、Xcache、Redis 五种,优化系统将会依据当前服务器环境依次选用接口,单服务器环境中推荐使用APC,多服务器环境中推荐使用Redis或Memcache。
数据层是以表为单位的类文件,所有表类都继承discuz_table基类,基类实现缓存操 作的相关函数;理论上所有的数据表均可以缓存,目前产品在六个压力大的数据表内置开启了缓存 机制:用户相关表、回帖、主题、主题和专辑关系、淘贴专辑、用户关注关系。
- 用户相关表
缓存表:'common_member', 'count', 'status','profile', 'field_home', 'field_forum'。
UID为缓存KEY。表数据更新时缓存数据会同步更新。
- 回帖
以TID为单位,缓存第一页的post数据。表数据更新时缓存数据会同步更新。
- 主题
TID为缓存KEY。表数据更新时缓存数据会同步更新。
版块列表默认参数第一页时以 forumdisplay_FID 为缓存KEY,缓存时间内数据不更新。
- 主题和专辑关系
以TID为单位,此TID的专辑ID集合,表数据更新时缓存数据会同步更新。
- 淘贴专辑
以TID为单位,此TID的专辑集合,缓存时间内数据不更新。
- 用户关注关系
以UID为单位,此UID关注用户的关系数据,缓存时间内数据不更新。
内存级缓存层实现细节
- discuz_table基类中缓存机制的实现
-
123456789
/**
* @var string 缓存主键名前缀,为空时表示此表不支持缓存
*/
protected
$_pre_cache_key;
/**
* @var string 缓存时间,以秒为单位,0表示永久或相关配置文件中的默认值
*/
protected
$_cache_ttl;
- discuz_table基类中缓存机制的方法
-
1234567891011121314
//缓存一个变量到缓存中,如果 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
)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了