用于缓存相关数据的模式

Sha*_*ays 5 php database caching scalability cakephp

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

我们来看一个典型的作者后关系,它由我的数据库中的2个表表示.当我在数据库中查询特定的博客文章时,同时CakePHP中的内置ORM功能也会获取帖子的作者,帖子上的评论等等.所有这些都作为一个大屁股嵌套数组返回,我使用相关博客文章的唯一标识符存储在缓存中.

更新博客帖子时,它是用于销毁帖子的缓存的子播放,并使用下一个请求重新生成它.

但是当主要实体(在这种情况下是博客文章)不是更新时会发生什么,而是一些相关数据呢?例如,可以删除评论,或者作者可以更新他的化身.是否有任何方法(模式)可用于跟踪相关数据的更新,并相应地将更新应用于我的缓存?

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

Unr*_*son 2

很简单,缓存条目可以

  • 添加
  • 被摧毁

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

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

那么你可以

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

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

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

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

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

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