【问题标题】:APC Cache Consistency ProblemAPC 缓存一致性问题
【发布时间】:2011-10-22 07:29:59
【问题描述】:

我已经内置到我们的 ORM 层对象缓存中。基本上,SQL 查询的哈希用作键,值包含数据库结果集中的对象集合。但是,如果结果集中的对象之一被更新,缓存的结果集中不包括更新的对象,这会产生问题。没有写一致性。我将如何实现写一致性?

谢谢

更新:目前我有一个 ObjectWatcher 类来处理缓存的对象及其键。对象使用可检索的键进行缓存,因此对于 Person 类它是 Person.101 例如。 SQL 查询是散列的,键映射到一个依赖对象,其中包含依赖对象的列表。所以SELECT * FROM person 可能会从 APC 返回一个 Dependency 对象,该对象映射到 Person.101 和 Person.102,结果集合是从这个 Dependency 对象构建的。这适用于单个对象的更新。因此,如果我更新 Person.101 并将新的更新对象放入 APC 以覆盖旧的对象,则当运行较旧的查询时,更新的对象将被放入该结果集中,这可能是不正确的。我需要一种方法来清除内存中的对象,以及包含对更新对象的引用的所有 Dependency 对象。在 APC 中是否可以搜索包含或过滤键和值的键或值?

【问题讨论】:

    标签: php mysql caching orm apc


    【解决方案1】:

    此问题与 APC 无关。
    您需要管理数据将如何存储在 APC(或任何其他存储)中。如果您想更新 APC 中键的值,何时更改对象 - 只有当对象知道键(查询哈希)并且该对象应该能够从另一个对象收集所有数据时才可能那个查询。这听起来像是荒谬的想法。

    任何模型都应该按照单一职责原则设计,所以如果你想缓存整个对象(这也不是一个好主意),那么为每个对象创建唯一的键。
    此外,对象不应该关心它们将如何存储(缓存)以及在哪里。所以你需要一个对象来管理对象缓存。

    而且我建议不要缓存整个对象,而只缓存 DB 中的记录值,这需要很长时间才能从 DB 中获取它们。

    但是如果你仍然想使用 SQL 查询的哈希作为键,那么你可以使用tags 并在这些标签中写入对象的“名称”。 例如,如果在结果集中有对象 Person、Employer 和 Customer,那么 key 将有标签“person”、“employer”和“customer”。而且,当客户对象发生变化时,您可以从缓存中删除所有标有“客户”标签的键。
    但是,无论如何,这不是 Customer 对象的责任,所有这些都应该由另一个对象来管理。

    问题已编辑,所以我也将编辑我的答案:)

    Tags 不是 APC 的一部分,是 wrapper 的一部分。标签是非常有用的东西,非常适合您的情况。

    持有对更新对象的引用

    标签可以是这个参考。您不需要按标签搜索键,您只需要删除与该标签关联的所有键(以保持数据真实),并且此包装器具有执行此操作的现有方法。

    在示例中:
    让我们查询SELECT * FROM persons WHERE email <> '' - 此查询的缓存结果将由标签“person”标记。

    因此,当我们更新任何 Person 对象时,我们将删除所有标有“person”标签的键,因此我们的查询结果 SELECT * FROM persons WHERE email <> '' 将被删除,并且在下一个请求中,我们的脚本将生成新的 (实际)值。

    【讨论】:

    • 对不起,我应该更具体,我已经更新了问题。如果我将标签写入 APC 中的键,我如何搜索包含标签的键?
    猜你喜欢
    • 2011-04-21
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多