php - 缓存相关数据的模式

标签 php database caching cakephp scalability

我目前正在开发应用程序的基础,并寻找优化性能的方法。我的设置基于 the CakePHP framework ,但我相信我的问题与任何技术堆栈相关,因为它与数据缓存相关。

让我们来看一个典型的后作者关系,它由我的数据库中的 2 个表表示。当我在数据库中查询一篇特定的博文时,同时 CakePHP 中的内置 ORM 功能还获取了该博文的作者、对博文的评论等。所有这些都作为一个庞大的嵌套数组返回,我使用相关博客文章的唯一标识符将其存储在缓存中。

更新博客文章时,销毁文章的缓存并在下一个请求时重新生成它是 children 的游戏。

但是当更新的不是主要实体(在本例中是博客文章)而是一些相关数据时会发生什么?例如,可以删除评论,或者作者可以更新他的头像。是否有任何方法(模式)可供我考虑跟踪相关数据的更新,并相应地将更新应用到我的缓存?

我很想知道您是否也遇到过类似的挑战,以及您是如何成功克服障碍的。如果您正在使用另一个堆栈,请随意提供一个抽象的视角。无论如何,非常感谢您的意见,非常感谢!

最佳答案

比较简单,缓存项可以

  • 已添加
  • 销毁

您应该注意在相关数据更改时销毁缓存条目(因此在应用层中,除了更新数据外,您还应该在更新某些表时销毁某些类型的缓存条目;您通过硬编码来跟踪依赖关系).

如果你想聪明一点,你可以让你的缓存对象声明它们的依赖关系,并缓存你的数据库表的最后更新时间。

那么你可以

  • 获取缓存数据,检查依赖关系,
  • 获取相关数据库表的更新时间和
  • 如果记录过时(你的大缓存条目所依赖的表的更新时间晚于缓存条目的时间),则删除它并从数据库中获取新数据。

您甚至可以将上述内容集成到您的持久层中。

编辑:
当然,以上是当你想拥有一致的缓存时。有时,对于某些数据,您可以放宽一致性要求,并且在某些情况下简单的 TTL 就足够了(举一个简单的例子,如果您的 ttl 为 1 秒,您应该基本上不会给用户带来麻烦,并且可以提供帮助数据处理;如果时间更长,您可能仍然没问题 - 例如,假设您正在缓存国家/地区 ISO 代码列表;如果您说让我们将其缓存 86400 秒,您的应用程序可能完全没问题) .

此外,您还可以跟踪信息呈现给用户的时间,例如

  • 假设用户已经从缓存中看到数据 A,并且我们知道该数据是在时间 t1 创建/修改的
  • 用户对数据 A 进行更改(并使其成为数据 B)并提交更改
  • 然后应用层可以检查数据 A 是否仍然与 DB 中一样(如果用户做出决定和/或更改的缓存数据确实是新鲜的)
  • 如果它是新鲜的,则存在冲突,用户应确认更改

这有额外从DB读取数据A的成本,但它只发生在写入时。 另外,冲突的发生不仅仅是因为缓存,还有可能是因为多个用户试图更改数据(即与锁定策略有关)。

关于php - 缓存相关数据的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3819552/

相关文章:

php - 旧 PHP 版本中 "use"的替代

php - 无需登录cpanel即可创建数据库

amazon-web-services - DynamoDB 中相同分区键的数据分布

mysql - 这是 MySQL 的良好做法吗

React-native 组件缓存(或防止卸载)(react-navigation)

javascript - <输入类型 ="date"> 在 mozilla 中不起作用

javascript - 使用 javascript 和 css 打印对齐不正确

php - 禁用记录后查找下一条记录?

mysql - MySQL 服务器的高 CPU 使用率

javascript - 检测广告 block 脚本,仅在硬重新加载时正常运行