首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 8 Redis缓存仅在通过Tinker运行查询时触发

Laravel 8 Redis缓存仅在通过Tinker运行查询时触发
EN

Stack Overflow用户
提问于 2022-06-15 15:51:56
回答 1查看 291关注 0票数 0

我正在一个Laravel 8项目中工作,该项目被用作后端的API。我使用MongoDB作为我的数据库和Redis服务器。

我已经使用predis在我的项目中配置了Redis,并且可以确认缓存确实存储和检索正确,但是我最近注意到的是缓存根本没有存储的奇怪行为,我知道这一点,因为每次查询1000万行的请求需要8秒,而且应该是几百个。

如果我通过浏览器向单个Application发出请求,那么任何超过第一个请求半小时的请求都应该被缓存和快速处理,但是都是缓慢的,如果我在tinker中运行Application查找,然后加载我的视图,那么它是缓存的,因为它是立即加载的吗?

这里发生了什么,我的代码可能遗漏了什么?

代码语言:javascript
复制
/**
 * Display the specified resource.
 *
 * @param  \App\Models\Application  $application
 * @return \Illuminate\Http\Response
 */
public function show(Application $application)
{
    $application = Cache::store('redis')->remember("application:$application", Carbon::now()->addMinutes(30), function () use ($application) {
        return Application::with([
            'payday', 'response', 'apiLinks'
        ])->find($application)->first();
    });

    return response()->json([
        'application' => $application
    ], 200);
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-16 09:00:51

好的,您似乎在这里使用模型绑定,但是您打算缓存模型。绑定模型不缓存。将代码更改为:

代码语言:javascript
复制
/**
 * Display the specified resource.
 *
 * @param  int  $application
 * @return \Illuminate\Http\Response
 */
public function show($application)
{
    $application = Cache::store('redis')->remember("application:$application", Carbon::now()->addMinutes(30), function () use ($application) {
        return Application::with([
            'payday', 'response', 'apiLinks'
        ])->find($application)->first();
    });

    return response()->json([
        'application' => $application
    ], 200);
}

为了提醒您,如果您执行Route::get('application/{application}', function (Application $application) { ... });,即在函数定义中提供一个类型,Laravel将尝试自动检索由路由参数提供的模型(正如我前面提到的,称为路由模型绑定)。但是,由于您希望缓存模型,所以不应该允许这种情况发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72634354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档