Laravel: 如何缓存路由5分钟?
Laravel: how to cache route for 5 minutes?
我想在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 (artisan) 或者我应该更改 .htaccess
文件(我使用的是 apache)?
这其实是一个很容易解决的问题。在您的函数 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);
}
所以,首先,检查 "leaders"
是否存在于缓存中。如果是这样,它只会 return 那个。如果没有(第一次调用此路由时会出现这种情况),那么它将进行计算,并使用 Cache::put()
,将其存储在缓存中,然后 return。在接下来的 5 分钟内,只要命中这条路线,它就会 return 缓存的结果,直到重新开始该过程。
请注意,上面是伪代码,因为您的控制器没有显示,但该方法可以很容易地适应现有代码。此外,您可能需要在控制器顶部包含 use Cache;
,或通过 \Cache::{method}
引用 Cache
关于缓存的一切都可以在文档中找到:https://laravel.com/docs/5.7/cache
添加到@TimLewis 的答案中,如果您使用的是 laravel 5.8 或更新版本,那么 Cache::remember 函数可以大大简化控制器代码
public function getLeaders(){
$leaders = Cache::remember('leaders', 300, function () {
return Leader::where(...)->get();
});
return response()->json(['leaders' => $leaders]);
}
Cache::remember
函数负责整个缓存工作流,它首先检查缓存中的领导者对象,然后 returns 检查是否存在。如果没有,它将运行闭包内的代码并将结果存储在第一个参数中指定的键下的缓存中,持续时间为第二个参数中指定的秒数。所以在这种情况下,它将在键 "leaders" 下缓存结果 300 秒(5 分钟)。
Laravel > 7 你可以使用 cash::rmember(),你会节省很多少写
示例:
$getleaders = Cache::remember('getleaders', 'minutes', function () {
u query;
});
我想在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 (artisan) 或者我应该更改 .htaccess
文件(我使用的是 apache)?
这其实是一个很容易解决的问题。在您的函数 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);
}
所以,首先,检查 "leaders"
是否存在于缓存中。如果是这样,它只会 return 那个。如果没有(第一次调用此路由时会出现这种情况),那么它将进行计算,并使用 Cache::put()
,将其存储在缓存中,然后 return。在接下来的 5 分钟内,只要命中这条路线,它就会 return 缓存的结果,直到重新开始该过程。
请注意,上面是伪代码,因为您的控制器没有显示,但该方法可以很容易地适应现有代码。此外,您可能需要在控制器顶部包含 use Cache;
,或通过 \Cache::{method}
Cache
关于缓存的一切都可以在文档中找到:https://laravel.com/docs/5.7/cache
添加到@TimLewis 的答案中,如果您使用的是 laravel 5.8 或更新版本,那么 Cache::remember 函数可以大大简化控制器代码
public function getLeaders(){
$leaders = Cache::remember('leaders', 300, function () {
return Leader::where(...)->get();
});
return response()->json(['leaders' => $leaders]);
}
Cache::remember
函数负责整个缓存工作流,它首先检查缓存中的领导者对象,然后 returns 检查是否存在。如果没有,它将运行闭包内的代码并将结果存储在第一个参数中指定的键下的缓存中,持续时间为第二个参数中指定的秒数。所以在这种情况下,它将在键 "leaders" 下缓存结果 300 秒(5 分钟)。
Laravel > 7 你可以使用 cash::rmember(),你会节省很多少写 示例:
$getleaders = Cache::remember('getleaders', 'minutes', function () {
u query;
});