【问题标题】:Best way to "cache" Eloquent queries“缓存” Eloquent 查询的最佳方式
【发布时间】:2013-08-22 10:56:21
【问题描述】:

我有一个应用程序在循环中运行类似SomeModel::getValue($month, $year, $departmentId) 的函数。

getValue 创建查询并返回结果:

return self::where('department_id', '=', $department_id)
           ->where('year', '=', $year)
           ->where('month', '=', $month)
           ->pluck('value');

在这个循环中,它可能会多次调用相同的参数。 我想知道每次我想获取数据时避免创建新查询的最佳方法。

我考虑在模型中创建一个静态数组,并在每次调用 getValue 时对其进行匹配。如果数组中存在值,则返回它,如果不存在则创建查询。

我的解决方案好吗?你有什么其他想法吗?谢谢!

我正在使用 Laravel 4

【问题讨论】:

    标签: php mysql laravel laravel-4 eloquent


    【解决方案1】:

    静态缓存是最好的方法,只要你能接受它的含义:

    • 您只缓存每个请求 -- 如果用户刷新,您从头开始重新创建缓存
    • 您将需要一些内存开销来保持填充的静态数组。这本身并不是什么大问题,除非您必须考虑并发性(每个请求都有自己的静态数组)。

    根据静态数组的最大大小,最好确定缓存的有效期(例如 1 分钟),然后将缓存推送到某种形式的交叉请求缓存中,以便您可以重复使用它(请参阅 APC、Memcached 甚至简单的 MySQL INSERT in a table)——在所有情况下,只需保存序列化数组并在执行实际计算之前将其作为附加步骤加载。

    【讨论】:

    • 请注意,APC 和 Memcached 也使用 php 序列化和反序列化存储数组和对象,浮点数、整数和字符串不会被序列化,如果存储大型数组或对象,这会增加 CPU 负载.
    • 不想详细说明,因为最初的问题是关于静态缓存的,但是是的 - 假设您想使用任何跨请求缓存,这取决于大小和其他限制,这是最好的将其拆分为许多小块而不是大块,例如,如果数组很大,则每个数组项 1 个条目。
    • 嘿,谢谢。这里的主要目标是为相同的参数运行一次查询。我想我会使用模型中的静态数组,因为该数组不会包含超过 100 个项目
    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多