緩存層的引入是為瞭解決 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)