# 自动缓存
* * * * *
上面的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
- 自动缓存
- 全自动缓存
- 索引
- 数据签名
- 全自动事务
- 队列