使用 Redis 缓存 Eloquent 模型实例

vas*_*ino 3 php caching redis laravel eloquent

所以在 Laravel 5.1 中,我有两个 Eloquent 模型:

\App\Model\Product
\App\Model\Brand
Run Code Online (Sandbox Code Playgroud)

品牌和产品之间存在一对多的关系(即一个品牌可能有多个产品)。在我们的系统中,每次我们想要检索产品的雄辩模型时,我们都急切地加载品牌,如下所示:

$product = \App\Model\Product::whereId({integer})->with('brand')->first();
Run Code Online (Sandbox Code Playgroud)

我们不希望产品经常变化,所以为了减少数据库查询,提高性能,我们想用Redis缓存这些Product模型,以便在执行数据库查询之前,我们会检查Product实例是否已经存储在缓存中。所以我的问题是,能够从 Redis 存储和检索这些产品实例的最佳方法是什么?

我知道我们可以通过执行以下操作将 eloquent 模型转换为 JSON:

$json = $product->toJson();
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这将允许我将“字符串化”模型存储在 Redis 中。但是,我将如何进行相反的操作 - 将存储的 JSON 转换回 Product 实例(同时具有预先加载的 Brand 关系),我可以在代码中将其用作普通模型实例?

此外,为了减少 Redis 操作,这必须与 MGET 一起使用,允许我一次检索多个实例。流水线获取操作也是可以接受的。

这是可行的,还是有更好的方法来实现这一目标?

先感谢您。

小智 8

您应该在存储实例之前对其进行序列化,然后以这种方式将其反序列化:

Redis::set('my_key', serialize($product));
...
$product = unserialize(Redis::get('my_key'));
Run Code Online (Sandbox Code Playgroud)

如果您有访问器或急切加载关系数据,则无法从 JSON 存储您的实例。