【问题标题】:Caching Eloquent model instances with Redis使用 Redis 缓存 Eloquent 模型实例
【发布时间】:2016-09-04 17:43:36
【问题描述】:

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

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

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

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

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

我知道我们可以通过以下方式将 eloquent 模型转换为 JSON:

$json = $product->toJson();

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

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

这是否可行,或者,有更好的方法来实现吗?

提前谢谢你。

【问题讨论】:

    标签: php laravel caching redis eloquent


    【解决方案1】:

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

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

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

    【讨论】:

    • 对我来说非常有用的答案。缓存序列化允许检索预先加载的数据。
    • 我很确定,当我发布我的回复时,急切的加载和访问器正在搞乱序列化。代码中似乎发生了一些变化。
    • 我不知道它是否取决于连接类型:在 tcp 上我必须序列化和反序列化,而在 unix 套接字上它可以在没有序列化/反序列化的情况下工作
    猜你喜欢
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2018-04-26
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多