gpt4 book ai didi

php - APC缓存一致性问题

转载 作者:行者123 更新时间:2023-11-29 00:53:59 25 4
gpt4 key购买 nike

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

谢谢

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

最佳答案

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

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

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

但是如果你仍然想使用 SQL 查询的散列作为键,那么你可以使用 tags并在这些标签中写下对象的“名称”。例如,如果在结果集中您有对象 Person、Employer 和 Customer,那么 key 将具有标签“person”、“employer”和“customer”。并且,当对象 Customer 将被更改时,您可以从缓存中删除所有标有“customer”标签的键。
但是,无论如何,这不是 Customer 对象的责任,所有这些东西都应该由另一个对象管理。

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

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

which hold a reference to the updated object

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

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

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

关于php - APC缓存一致性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6981214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com