问题描述
当我们使用 memcached 的瞬态时,我希望有人能为我清除空气。
当运行像 w3-total-cache 这样的插件时,使用瞬态来存储大量的后期查询有什么实际的性能优势?如果我们正在运行 memcached,那么这些查询是否已经被 memcached 缓存了?那么,如果有的话,这两个方法是一起使用的呢?
最佳解决思路
什么时候和如何使用瞬态或对象缓存有点棘手和 site-dependent 。以下是细分:
-
当不使用持久性对象缓存 (如 memcached) 时:
-
瞬态存储在数据库中
-
对象缓存中的对象仅在页面请求期间被缓存。
-
-
当使用持久性对象缓存 (如 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。