缓存层的引入是为了解决 MYSQL 自身对高并发处理的性能瓶颈,目前产品缓存层采用主流的 Key-Value 对形式,内存级的缓存产品很多,支持的
内存优化接口有 Memcache 、 eAccelerator 、 Alternative PHP Cache(APC) 、 Xcache 、 Redis
五种,优化系统将会依据当前服务器环境依次选用接口,单服务器环境中推荐使用 APC,多服务器环境中推荐使用 Redis 或 Memcache 。
数据层是以表为单位的类文件,所有表类都继承 discuz_table 基类,基类实现缓存操 作的相关函数;理论上所有的数据表均可以缓存,目前产品在六个压力大的数据表内置开启了缓存 机制:用户相关表、回帖、主题、主题和专辑关系、淘贴专辑、用户关注关系
用户相关表
数据 | 缓存 KEY | 缓存时效 |
---|---|---|
用户相关表 | UID | 表数据更新时缓存数据会同步更新 |
回帖 | TID | 缓存第一页的 post 数据, 表数据更新时缓存数据会同步更新 |
主题 | TID | 表数据更新时缓存数据会同步更新 (版块列表默认参数第一页时以 forumdisplay_FID 为缓存 KEY, 缓存时间内数据不更新) |
主题和专辑关系 | TID | 此 TID 的专辑 ID 集合, 表数据更新时缓存数据会同步更新 |
淘贴专辑 | TID | 此 TID 的专辑集合, 缓存时间内数据不更新 |
用户关注关系 | UID | 缓存时间内数据不更新 |
内存级缓存层实现细节
discuz_table 基类中缓存机制的实现:
/** * @var string 缓存主键名前缀, 为空时表示此表不支持缓存 */ protected $_pre_cache_key; /** * @var string 缓存时间, 以秒为单位,0 表示永久或相关配置文件中的默认值 */ protected $_cache_ttl;
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)