Php 使用Redis和MySQL加载和更新数据的最佳实践是什么?
我使用Redis作为缓存层,我想知道什么是最佳实践,或者如何与DB(在本例中是MySQL)一起正确使用它 这里有一个用户仪表板功能的示例:Php 使用Redis和MySQL加载和更新数据的最佳实践是什么?,php,mysql,redis,lumen,Php,Mysql,Redis,Lumen,我使用Redis作为缓存层,我想知道什么是最佳实践,或者如何与DB(在本例中是MySQL)一起正确使用它 这里有一个用户仪表板功能的示例: public function updateDashboardUser(Request $request) { $user = app('redis')->hGetAll($request->userID); //Get data from cache if ($user) { //if there is da
public function updateDashboardUser(Request $request) {
$user = app('redis')->hGetAll($request->userID); //Get data from cache
if ($user) { //if there is data use this
$id = $user['id'];
$name = $user['name'];
} else { //otherwise use this
$user = User::select('id', 'name')->where('id', '=', $request->userID)->first();
$id = $user->id;
$name = $user->name;
}
return response()->json(['id' => $id, 'name' => $name], 200);
}
然而,即使缓存中的$user
可能为空,也无法以某种方式到达此else语句。有更好的方法吗
同时在更新。。。当其中一个数据库中的数据发生更改时,是否有更好的方法自动更新这两个数据库(缓存和数据库)
public function editDashboard(Request $request) {
$user = Route::find($request->userID);
$user->name = $request->name;
$user->save();
$cacheEdit = app('redis')->hSet($user->id, 'name', $request->name);
return response()->json(['status' => '200'], 200);
}
目前我是这样做的,但有时可能只更改其中一个,然后缓存数据(反之亦然,DB数据)不会同步/更新
这是我第一次使用Redis和缓存,非常感谢您的帮助。- 您不应该直接使用RedisAPI,而应该使用Laravel缓存API,它允许一些抽象,您甚至不需要知道哪一个是底层缓存
- 通过使用雄辩而不是查询生成器,您可以解锁一些非常强大的功能,例如模型事件。例如,在您的
模型中:用户
受保护的静态函数启动()
{
父::booted();
$cache=app('cache');
静态::已更新(函数($user)使用($cache){
$cacheKey=$user->getCacheKey();
如果($cache->has($cacheKey){
$cache->put($cacheKey,$user,30);//30是缓存中该值的生存期,您可以随意更改
}
});
静态::已删除(函数($user)使用($cache){
$cache->forget($user->getCacheKey());
});
}
公共函数getCacheKey()
{
返回“用户”。$this->getKey();
}
每当您使用Eloquent更新或删除用户时,Laravel会自动调用这些“事件挂钩”
然后,它允许您流畅地执行以下操作:
使用App\User;
使用\Http\Request;
使用Illumb\Contracts\Routing\ResponseFactory;
使用Illumb\Contracts\Cache\Repository作为缓存;
公共函数updateDashboardUser(请求$Request,缓存$Cache,响应系数$ResponseFactory)
{
$id=$request->userID;
$user=$cache->memory('users')。$id,30,函数()使用($id){
返回用户::findOrFail($id);
});
返回$responseFactory->json($user->only(['id','name']),200);
}
如本文所述,您可以使用记住
(或记住
)从缓存中检索某些内容,如果找不到,则自动退回到闭包中。findOrFail
随后将从数据库中检索它,并最终抛出illumb\database\Eloquent\ModelNotFoundException
,因为发送成功响应没有意义。我还替换了您的助手如响应
,通过对契约(Laravel接口)使用依赖注入,这是最干净的实践
- 您不应该直接使用RedisAPI,而应该使用Laravel缓存API,它允许一些抽象,您甚至不需要知道哪一个是底层缓存
- 通过使用Elount而不是query builder,您可以解锁一些非常强大的功能,例如模型事件。例如,在您的
用户
模型中:
受保护的静态函数启动()
{
父::booted();
$cache=app('cache');
静态::已更新(函数($user)使用($cache){
$cacheKey=$user->getCacheKey();
如果($cache->has($cacheKey){
$cache->put($cacheKey,$user,30);//30是缓存中该值的生存期,您可以随意更改
}
});
静态::已删除(函数($user)使用($cache){
$cache->forget($user->getCacheKey());
});
}
公共函数getCacheKey()
{
返回“用户”。$this->getKey();
}
每当您使用Eloquent更新或删除用户时,Laravel会自动调用这些“事件挂钩”
然后,它允许您流畅地执行以下操作:
使用App\User;
使用\Http\Request;
使用Illumb\Contracts\Routing\ResponseFactory;
使用Illumb\Contracts\Cache\Repository作为缓存;
公共函数updateDashboardUser(请求$Request,缓存$Cache,响应系数$ResponseFactory)
{
$id=$request->userID;
$user=$cache->memory('users')。$id,30,函数()使用($id){
返回用户::findOrFail($id);
});
返回$responseFactory->json($user->only(['id','name']),200);
}
如本文所述,您可以使用记住
(或记住
)从缓存中检索某些内容,如果找不到,则自动退回到闭包中。findOrFail
随后将从数据库中检索它,并最终抛出illumb\database\Eloquent\ModelNotFoundException
,因为发送成功响应没有意义。我还替换了您的助手如响应
,通过对契约(Laravel接口)使用依赖注入,这是最干净的实践
实际上我在使用流明。这对流明也有效吗?我不知道,我从来没有使用过Lumen@harunB10他说他正在寻找“redis和mysql”的最佳实践,回答是“与其直接使用redis API,不如使用Laravel cache API”.Laravel的缓存方法甚至比不上redis的%1。它只是一个支持基本操作的通用接口(对于实现该接口的所有驱动程序来说都是通用的)。它不包括hash、list、set、sorted set、streams、hyperloglog,这正是redis的与众不同之处,也是它的强大之处。laravel/lumen在这方面没有任何区别-它们只是两个兼容的工具,可以使用redis作为依赖项来执行所有操作。因此,如果您想将其应用于“lumen”-这没有任何区别。在这里它也说“流明缓存驱动程序利用