我已经内置到我们的ORM层对象缓存中。基本上,SQL查询的哈希值用作键,值包含DB结果集中的对象集合。但是,如果更新结果集中的某个对象,则缓存的结果集不包含更新的对象,这会产生问题。没有写一致性。我如何实现写一致性?
由于
更新:目前我有一个ObjectWatcher类来处理缓存的对象及其键。对象使用可检索的密钥进行缓存,因此对于Person类,它是Person.101。对SQL查询进行哈希处理,并将键映射到Dependency对象,该对象在其中具有依赖对象的列表。因此SELECT * FROM person
可能会从APC返回一个Dependency对象,该对象映射到Person.101和Person.102,生成的集合是从此Dependency对象构建的。这适用于更新单个对象。因此,如果我更新Person.101并将新更新对象放入APC覆盖过时的那个,那么当运行较旧的查询时,更新的对象将被放入该结果集中,这可能是不正确的。我需要一种方法不仅清理内存中的对象,还清除所有包含对更新对象的引用的Dependency对象。在APC中有没有办法搜索包含或包含或过滤键和值的键?
答案 0 :(得分:1)
这个问题与APC无关 您需要管理数据如何存储在APC(或任何其他存储)中。如果你想在APC中更新key的值,当对象将被更改时 - 只有当Object知道密钥(查询的哈希)并且该对象应该能够从另一个对象收集所有数据时,才可能获取对象,那个查询。这听起来像荒谬的想法。
任何模型都应该采用单一责任原则设计,所以如果你想缓存整个对象(这也不是一个好主意),那么为每个对象创建唯一的密钥。
此外,对象不应该关心它们将如何存储(缓存)以及在何处存储。所以你需要一个对象来管理对象缓存。
我建议不要缓存整个对象,而只缓存DB中的记录值,这需要很多时间才能从DB中获取它们。
但是如果您仍然希望使用SQL查询的哈希作为键,那么您可以使用tags并在这些标记中写入对象的“名称”。 例如,如果在结果集中您有对象Person,Employer和Customer,那么key将具有标签“person”,“employer”和“customer”。并且,当对象Customer将被更改时,您可以从缓存中删除所有标记有“customer”标记的键 但是,无论如何,它不是Customer对象的责任,所有这些都应该由另一个对象管理。
问题被编辑了,所以我也会编辑我的答案:)
标签不是APC的一部分,是包装器的一部分。标签是非常有用的东西,对你的情况非常方便。
,其中包含对更新对象的引用
标签可以作为此参考。您不需要按标记搜索键,只需删除与该标记关联的所有键(以保持数据实际),并且此包装器具有现有方法。
在例子中:
让我们查询SELECT * FROM persons WHERE email <> ''
- 此查询的缓存结果将标记为“人”。
因此,当我们更新任何Person对象时,我们将删除所有标记为“person”的键,因此我们将删除查询SELECT * FROM persons WHERE email <> ''
的结果,并在下一个请求中生成脚本新的(实际)价值。