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

我想在 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

});

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


如何设置这样的配置?是否可以只使用 Laravel(工匠)或者我应该更改.htaccess文件(我使用的是 apache)?


弑天下
浏览 182回答 3
3回答

缥缈止盈

这实际上是一个非常简单的解决问题。在您的函数getLeaders()中,您需要修改代码:public function getLeaders(){&nbsp; $leadersCache = Cache::get("leaders", null);&nbsp; if($leadersCache){&nbsp; &nbsp; return response()->json(["leaders", $leadersCache], 200);&nbsp; }&nbsp; $leaders = Leader::where(...)->get();&nbsp; Cache::put("leaders", $leaders, 5);&nbsp; return response(["leaders", $leaders], 200);}所以,它的作用是首先检查"leaders"缓存中是否存在。如果是这样,它将简单地返回。如果没有(第一次调用此路由时就是这种情况),那么它将进行计算,并使用Cache::put(),将其存储在缓存中,然后返回。在接下来的 5 分钟内,只要这条路由被命中,它就会返回缓存的结果,直到进程重新开始。请注意,上面是伪代码,因为没有显示您的 Controller,但该方法可以轻松适应现有代码。此外,您可能需要use Cache;在控制器顶部包含,或Cache通过参考\Cache::{method}有关缓存的所有内容都可以在文档中找到:https ://laravel.com/docs/5.7/cache

至尊宝的传说

要添加到@TimLewis 的答案,如果您使用的是 laravel 5.8 或更高版本,那么 Cache::remember 函数可以大大简化控制器代码public function getLeaders(){&nbsp; $leaders = Cache::remember('leaders', 300, function () {&nbsp; &nbsp; return Leader::where(...)->get();&nbsp; });&nbsp; return response()->json(['leaders' => $leaders]);}该Cache::remember函数负责整个缓存工作流程,它首先检查缓存中的领导者对象,如果存在则返回。如果不是,它运行闭包内的代码并将结果存储在第一个参数中指定的键下的缓存中,持续第二个参数中指定的秒数。因此,在这种情况下,它会将结果缓存在关键“领导者”下 300 秒(5 分钟)。

慕慕森

Laravel > 7 你可以使用 cash::rmember(),你会节省很多写少例子:$getleaders = Cache::remember('getleaders', 'minutes', function () {&nbsp;u query;&nbsp; });
打开App,查看更多内容
随时随地看视频慕课网APP