本章将对数据结果缓存、请求缓存、查询缓存三种缓存方式进行实践讲解。
数据缓存常见于将是数据库查询的结果进行缓存。在缓存时效内,不再对数据库进行查询。
//检测是否有缓存get_user_lists
if(!Cache::has('get_user_lists')) {
//没有找到get_user_lists的缓存
$res = Db::name('user')->select();
//将结果保存到缓存中,缓存名设置为get_user_lists
Cache::set('get_user_lists',$res,10);
}
参数说明:
'get_user_lists' 缓存的名称,通过此名称拿缓存数据。
$res 缓存的数据
10 代表缓存的时间,单位秒
避免缓存写入并发出现的写入失败,可以使用remember
缓存锁机制。
$user_list = Cache::remember("get_user_lists",function(){
// 如果没有get_user_lists缓存,则写入return 的缓存
return Db::name('user')->select();
},10);
Cache::rememeber
方法会检测缓存get_user_lists是否存在,如果不存在get_user_lists,才会写入回调函数内的缓存。remember在写入时会自动上锁,写入完成解锁。
专门针对数据库查询设计的。在查询中添加cache
方法即可,它支持所有的查询操作。
// 使用系统时间
$user = Db::name('user')->cache(true)->find();
//缓存30秒
$user = Db::name('user')->cache(30)->select();
//缓存30秒并设置缓存名称,这种适合在查询外部使用。
$user = Db::name('user')->cache('get_user_list',30)->select();
在有效的缓存时间内,不会再次执行数据库查询操作。
也可以称呼为路由缓存。使用请求缓存后,会缓存整个响应输出的页面,请求缓存仅对GET请求有效。
有两种方式定义
局部缓存 - 在route.php
文件内,对单个路由规则配置
Route.get('/','index/index/index').cache(60);
全局缓存 - 在app.php
开启全局路由缓存
'request_cache' => true,
'request_cache_expire' => 3600,
'request_cache_except' => [
// 排除列表和user模块
'/user/index'
],
在使用文件缓存时,即使缓存失效之后,runtime/cache目录里的缓存文件并不会被删除。