如何在DoctrineCacheBundle cacheDriver中使用多个名称空间?

时间:2016-08-18 08:00:03

标签: symfony caching doctrine-orm

我知道我可以在config.yml文件中为DoctrineCacheBundle设置多个名称空间。但我可以使用一个驱动程序,但有多个名称空间吗?

案例是,在我的应用程序中,我想缓存所有实体的所有查询。问题在于在创建/更新操作时刷新缓存。我想只刷新部分缓存的查询。我的应用程序由多个客户端使用。因此,当客户端在他的数据中更新例如在Article实体中时,我想仅为该客户端清除仅针对Article的缓存。我可以为每个查询添加适当的ID并手动删除它们,但动态使用查询。在我的API移动应用程序中发送数据库应返回数据的版本号,因此我不知道最终将使用哪种ID。

1 个答案:

答案 0 :(得分:1)

不幸的是,我不认为你想做什么可以用一些配置魔法来解决。你想要什么样的索引缓存,为此你必须找到一个更强大的工具。

您可以查看doctrines second level cache。不知道它现在有多好(当它处于测试阶段时尝试过一次并且没有为我做好切割。)

或者您可以构建自己的缓存管理器。如果你这样做,我建议使用redis。数据结构将帮助您保持索引(可以使用memcached进行模拟,但需要更多工作)。我通过索引看到了什么。

您将拥有类似client_1_articles的密钥,其中1是客户端ID。在该密钥中,您将存储客户端文章的所有ID。对于每个文章ID,您将拥有像article_x这样的键,其中x是文章的ID。在此示例中,client_1_articles是一个基本索引,如果您希望在某些时候,它可以帮助您使来自客户端1的所有文章缓存失效。

上面示例的抽象实现将最终成为缓存中的图形结构,可能

- 组合索引'client_1:category_1'=> {article_1,article_2}

- 一个项目的多个索引,例如:'category_1'=> {article_1,article_2,article_3},'client_1'=> {article_1,article_3}

-etc。

希望这会以某种方式帮助你。至少这是我解决类似问题的方法。

祝你的项目好运,

Alexandru Cosoi