Php 使用Redis和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

我使用Redis作为缓存层,我想知道什么是最佳实践,或者如何与DB(在本例中是MySQL)一起正确使用它

这里有一个用户仪表板功能的示例:

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”-这没有任何区别。在这里它也说“流明缓存驱动程序利用