使用Redis

时间:2016-05-09 23:04:44

标签: php laravel caching redis eloquent

所以在Laravel 5.1中,我有两个雄辩的模型:

\App\Model\Product
\App\Model\Brand

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

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

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

我知道我们可以通过执行以下操作将一个雄辩的模型转换为JSON:

$json = $product->toJson();

这在技术上允许我在Redis中存储“字符串化”模型。但是,我如何能够执行oposite - 将存储的JSON转换回Product实例(也包含急切加载的Brand关系),我可以在代码中将其用作普通模型实例?

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

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

提前谢谢。

1 个答案:

答案 0 :(得分:3)

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

Redis::set('my_key', serialize($product));
...
$product = unserialize(Redis::get('my_key'));

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