Laravel:如何将路由缓存5分钟?

mr.*_*ris 3 php .htaccess caching laravel artisan

我想在Laravel项目中缓存一条路由,并每5分钟清除一次。

我搜索了一堆文章,但仅找到artisan route:cache命令,我不知道是否可以配置缓存时间。

所以,这是我的路线routes/web.php

$router->group(['middleware' => ['api','cors']], function () use ($router) {
    $router->get('game', ['uses' => 'GameController@checkGameStatus']);
    $router->get('promo', ['uses' => 'PromoController@sendPromoCode']);
    $router->get('get_leaders', ['uses' => 'GameController@getLeaders']); // <-- cache this for 5m
});
Run Code Online (Sandbox Code Playgroud)

每次用户加载评分页面时,该getLeaders()功能都会启动数据库请求以获取并计算所有用户结果。因此,我想减少数据库负载,并使其每5分钟计算一次所有结果。其余时间get_leaders路由应仅发送回缓存的json输出。

如何设置这样的配置?是否可以只使用Laravel(工匠)来做,还是应该更改.htaccess文件(我正在使用apache)?

Tim*_*wis 5

实际上,这是一个非常简单的解决问题的方法。在您的函数中getLeaders(),您需要修改代码:

public function getLeaders(){
  $leadersCache = Cache::get("leaders", null);
  if($leadersCache){
    return response()->json(["leaders", $leadersCache], 200);
  }

  $leaders = Leader::where(...)->get();
  Cache::put("leaders", $leaders, 5);

  return response(["leaders", $leaders], 200);
}
Run Code Online (Sandbox Code Playgroud)

因此,首先要做的是检查"leaders"缓存中是否存在。如果这样做,它将简单地返回该值。如果没有(第一次调用此路由时就是这种情况),它将进行计算,并使用Cache::put()将其存储在缓存中,然后返回。在接下来的5分钟内,只要点击此路由,它将返回缓存的结果,直到再次开始该过程为止。

请注意,上面的是伪代码,未显示您的Controller,但是该方法可以轻松地适用于现有代码。另外,您可能需要use Cache;在控制器顶部添加,或Cache通过\Cache::{method}

有关缓存的所有信息都可以在文档中找到:https : //laravel.com/docs/5.7/cache


Ale*_*Joy 5

要添加到@TimLewis的答案中,如果您使用的是laravel 5.8或更高版本,则Cache :: remember函数可以大大简化控制器代码

public function getLeaders(){
  $leaders = Cache::remember('leaders', 300, function () {
    return Leader::where(...)->get();
  });
  return response()->json(['leaders' => $leaders]);
}
Run Code Online (Sandbox Code Playgroud)

Cache::remember函数负责整个缓存工作流程,它首先检查领导者对象的缓存并返回(如果存在)。如果不是,它将在闭包内部运行代码,并将结果存储在缓存中的第一个参数指定的键下,并保留第二个参数指定的秒数。因此,在这种情况下,它将结果存储在键“ leaders”下的时间为300秒(5分钟)。