laravel cache :: remember vs缓存在路由过滤器中

时间:2018-08-17 19:23:35

标签: laravel caching redis

我正在寻找用于laravel api路由的非常通用的缓存设置。 我想最小化设置/代码更改,我可以找到的三个选项是:

  1. 使用模型上的Remember方法缓存每个雄辩的查询:
public function blogPosts(Request $request) {
    $request->validate([
       'category' => 'required|string'
    ])
    $category = request('category');

    return BlogPost::remember(1)->where('category', $category)->get();
}
  1. 将我的控制器的内容(经过验证)包装到Cache :: remember
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();
    })
}
  1. 使用路由过滤器:
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);
}
  1. 其他建议?

尤其是选项3似乎很容易实现。有什么陷阱吗? 如果查询参数可能有很多组合,可能会出现问题吗?即如果根据查询参数为一条路由缓存了100个不同的结果,是否有任何不利之处?

0 个答案:

没有答案
相关问题