# 自動緩存
* * * * *
上面的Redis在TP5中叫做緩存驅動,本章講的自動緩存跟驅動無關,也就是不管使用什么緩存驅動都可以使用自動緩存。
此處以初始化鉤子信息行為中的代碼舉個栗子
**自動緩存使用前代碼**
~~~
$list = cache('hook_list');
if (empty($list)) :
$list = $hook->column('id,name,addon_list');
empty($list) && cache('hook_list', $list, 3);
endif;
~~~
**自動緩存使用后代碼**
~~~
$list = auto_cache('hook_list', create_closure($hook, 'column', ['id,name,addon_list']));
~~~
兩段代碼都是查詢出鉤子列表信息并緩存3秒。
下面來看看這兩個函數的實現代碼
~~~
/**
* 通過類創建邏輯閉包
*/
function create_closure($object = null, $method_name = '', $parameter = [])
{
$func = function() use($object, $method_name, $parameter) {
return call_user_func_array([$object, $method_name], $parameter);
};
return $func;
}
~~~
從函數可以看出來 通過傳入對象,操作方法,參數 構建了一個閉包,但是閉包并沒有執行,意味著此處沒有進行數據庫查詢操作,然后將閉包返回。
~~~
/**
* 通過閉包控制緩存
*/
function auto_cache($key = '', $func = null, $time = 3)
{
$result = cache($key);
if (empty($result)) : $result = $func(); !empty($result) && cache($key, $result, $time); endif;
return $result;
}
~~~
auto_cache 函數的參數則是 緩存的key,閉包,緩存時間。
可以看到auto_cache函數中會先進行緩存存在的驗證,如果存在緩存則直接返回數據,若不存在則執行閉包進行數據庫查詢并緩存。
auto_cache('hook_list', create_closure($hook, 'column', ['id,name,addon_list']));
那么結合在一起就是通過create_closure函數創建了一個帶數據庫查詢操作的閉包但是并沒有執行數據庫操作,而是在auto_cache函數中先驗證緩存是否存在,若不存在才執行閉包中的查詢操作并返回數據。
- 序言
- 基礎
- 安裝環境
- 安裝演示
- 規范
- 目錄
- 介紹
- 后臺介紹
- 后臺首頁
- 會員管理
- 系統管理
- 系統設置與配置管理
- 菜單管理
- 系統回收站
- 服務管理
- 插件管理
- 文章管理
- 接口管理
- 優化維護
- SEO管理
- 數據庫
- 文件清理
- 行為日志
- 執行記錄
- 統計分析
- 接口介紹
- 接口文檔
- 錯誤碼設計
- Token介紹
- 前臺介紹
- 架構
- 架構總覽
- 生命周期
- 入口文件
- 模塊設計
- 依賴注入
- 控制器架構
- 邏輯架構
- 驗證架構
- 服務架構
- 模型架構
- 行為架構
- 插件架構
- 配置
- 配置介紹
- 配置加載
- 配置擴展
- 請求
- 請求信息
- 日志
- 后臺行為日志
- 系統執行日志
- 框架日志
- 數據
- 數據庫設計
- 數據字典
- 數據庫操作
- 事務控制
- 混合操作
- 實戰
- 控制器
- 邏輯與驗證
- 視圖與模型
- 插件研發
- 服務研發
- 接口研發
- 雜項
- 數據導入導出
- 二維碼條形碼
- 郵件發送
- 云存儲服務
- 支付服務
- 短信服務
- 微信分享
- 生成海報
- 聊天室
- PJAX
- Demo
- Widget
- 附錄
- 常量參考
- 配置參考
- 函數參考
- 進階
- Redis
- 自動緩存
- 全自動緩存
- 索引
- 數據簽名
- 全自動事務
- 隊列