问题描述

当我们使用 memcached 的瞬态时,我希望有人能为我清除空气。

当运行像 w3-total-cache 这样的插件时,使用瞬态来存储大量的后期查询有什么实际的性能优势?如果我们正在运行 memcached,那么这些查询是否已经被 memcached 缓存了?那么,如果有的话,这两个方法是一起使用的呢?

最佳解决思路

什么时候和如何使用瞬态或对象缓存有点棘手和 site-dependent 。以下是细分:

  1. 当不使用持久性对象缓存 (如 memcached) 时:

    • 瞬态存储在数据库中

    • 对象缓存中的对象仅在页面请求期间被缓存。

  2. 当使用持久性对象缓存 (如 memcached) 时:

    • 瞬态存储在对象缓存中

    • 对象缓存中的对象被缓存在持久性对象缓存中,因此可以跨页面请求使用。

所以是的,如果您使用 memcached,瞬态可以使事情更快。但是,如果您知道您正在使用 memcached 来开始使用,则可以直接使用对象缓存,而不是使用瞬态。

因此,正确的使用时间是:

对于公开发布的代码:

  • 当您必须存储需要一段时间才能生成/检索的任何东西,当瞬态过期时,可以使用 re-generated 或 re-retrieved 。因为这可能存储在数据库中,不要将其用于您已经从数据库获取的内容。你节省很少的时间,即使这个查询是一个大的连接等等。依靠数据库的智慧为此。优化查询。

  • 使用对象缓存可以存储可能需要经常需要的大型查询 (例如,帖子或用户),甚至在同一页面运行期间。

如果这是自定义站点的自定义代码,您有 (自定义) 控制权,并且您知道它使用 memcached,则瞬态和对象缓存基本上是相同的,与接口略有不同。所以你根本不需要使用瞬变。在这种情况下,wp_cache_set 和 wp_cache_get 工作相当不错,而且没有少量的开销瞬变增加。

对于 multi-site,对象缓存具有”global groups” 的优点,”global groups” 是网站中被认为是全局的特定组 (wp_cache_set 的第三个参数) 。您可以使用 wp_cache_add_global_groups() 将组添加到全局分组。

例如,用户全局分组在 multi-site 中,因为用户表是共享的。因此,这提供了性能加速,因为在一个站点上加载的用户将被放入持久性对象缓存中,由用户 ID 键入,并可立即在内存缓存中的系统上的所有其他站点上使用。换句话说,它们是全球性的。这可以提供显著的性能提升,并阻止您不需要 switch_to_blog 很多如果你想要 network-wide 数据。例如,most-recent-post 插件可以将全局分组存储在对象缓存中的最新帖子,然后网络上的每个站点都可以立即知道它,而无需搜索,因为它们正在从共享内存缓存中提取信息。

长话短说:你如何做的事情很大程度上取决于你的具体用例,以及你是否计划向一般公众提供这些代码,谁可能不会分享你的具体设置。

次佳解决思路

W3TC 确实存在差异,其中包括:

  • 缓存数据库查询;

  • 实现对象缓存 (瞬态使用) 。

这是两个完全独立的过程。

使用瞬态缓存来缓存单个数据库查询并不涉及 memcached 和 W3TC 。瞬态最好用于片段缓存的最终操作结果 (如 HTML 代码块),而不是中间步骤。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。