thinkphp数据缓存最佳实践

文章发布于 2023-08-16

本章将对数据结果缓存、请求缓存、查询缓存三种缓存方式进行实践讲解。

数据缓存

数据缓存常见于将是数据库查询的结果进行缓存。在缓存时效内,不再对数据库进行查询。

//检测是否有缓存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目录里的缓存文件并不会被删除。