mysql - Laravel:从数据库检索后将用户存储在存储库中以减少 MySQL 查询
问题描述
是否有一种既定的方法来存储您可能希望在内存/缓存中处理而不是进入数据库的模型?
我有带有created_by
和updated_by
列的模型,它们存储为User
id 的整数。我通常还会在前端显示创建每个模型的人的姓名。
假设登录用户与id
列相同created_by
。我将始终检查登录用户以进行身份验证,但在发送回 json 响应时,我不需要查询数据库两次以显示创建的用户名...
我有太多重复的查询获得相同的确切用户,这会减慢应用程序的速度。
这是 a 中方法的一个很好的用例UserRepository
吗?我还没有使用存储库,但想知道是否有其他人遇到过这个问题并想出了一个好的解决方案。
以下是可能会查询多个用户的位置示例:
// CompanyController.php
public function update(Request $request, Company $company)
{
// got user with ID = 1 here
$user = Auth::user();
if(!$user->can('update', $company)){
return response(403); //deny user
}
$company->fill($request->all());
$company->save();
// got user with ID = 1 here again...
// this model was created by the logged in user
return response()->json($company->with('created_user'));
}
// App\Company.php
public function created_user()
{
// get the user identified by ID in the created_by column
return $this->belongsTo(App\User::class, 'created_by');
}
我在 Laravel 5.4 和 PHP 7.2
解决方案
几年前,在查看 Laravel 对users
table 和sessions
,cache
表的查询(如果您为它们设置数据库驱动器)后,我自己也有相当多的困惑。
它是框架生命周期足迹,需要这些数据才能正常运行。
但是,如果您检查,这些查询最多需要 1-2 毫秒。我有一个拥有大量用户的项目,但老实说,这些查询从未影响性能,因为它们使用主键进行选择(主要是 id)。
我建议你评估taking down query time of a 2-3 millisecond query down to 1 millisecond
vs managing and maintaining an extra mid-layer cache service
。
现在,如果你想实现一个中间缓存层来最小化 MySQL 的负载,那么 laravel 的原生选项cache
可以永久保存/缓存你的集合或在特定时间段内。如果您想要更强大的功能,那么您可以尝试使用elasticsearch
或redis
。
我仍然要强调这样一个事实,即添加中间层缓存层是一种架构变化,它会带来维护时间和数据同步的开销。如果你在 Laravel 之外使用任何服务,请确保你有一个可靠的后备机制,这样如果服务关闭,你可以直接从 MySQL 加载数据。
推荐阅读
- ios - 允许点击通过 UITapGestureRecognizer 并到达下面的表格视图
- testing - 有没有办法在 TestCafe 测试中定义步骤?
- unity3d - 我应该将 Unity 库文件夹推送到 Github
- reactjs - 重新渲染子组件 React
- java - 如何在带有参数的for循环中注入bean
- r - 将函数应用于具有 data.table [R] 中的条件的每一列
- r - 如何阻止 ReadXL 跳过空列
- web2py - Web2py 客户端设备信息
- python - 使用 scipy.trapz 对数组进行二重积分(无解析函数)
- c++ - 我想找到最大值、最小值和平均值,但它为我分配了 0