我正在寻找用于laravel api路由的非常通用的缓存设置。 我想最小化设置/代码更改,我可以找到的三个选项是:
public function blogPosts(Request $request) {
$request->validate([
'category' => 'required|string'
])
$category = request('category');
return BlogPost::remember(1)->where('category', $category)->get();
}
public function blogPosts(Request $request) {
$request->validate([
'category' => 'required|string'
])
$category = request('category');
$cacheKey = 'blogPost_'.$category;
return Cache::remember($cacheKey, 1, function() use ($category) {
return BlogPost::where('category', $category)->get();
})
}
Route::get('/blogposts', 'BlogController@blogPosts')->before('cache.get')->after('cache.set')
Route::filter('cache.get', function( Route $route, Request $request ) {
$key = generateRouteKey($request)
if( Cache::has( $key ) ) return Cache::get( $key );
});
Route::filter('cache.set', function( Route $route, Request $request, Response $response ) {
$key = generateRouteKey($request);
if( ! Cache::has( $key ) ) Cache::put( $key, $response->getContent(), 1 );
});
function generateRouteKey(Request $request) {
$url = request()->url();
$queryParams = request()->query();
ksort($queryParams);
$queryString = http_build_query($queryParams);
$fullUrl = "{$url}?{$queryString}";
return sha1($fullUrl);
}
尤其是选项3似乎很容易实现。有什么陷阱吗? 如果查询参数可能有很多组合,可能会出现问题吗?即如果根据查询参数为一条路由缓存了100个不同的结果,是否有任何不利之处?