使用内存缓存龙虎大战做庄优化 龙虎大战做庄 主循环,实现龙虎大战做庄首页 0 SQL

Memcached 内存缓存可以龙虎大战做庄优化 龙虎大战做庄 很多功能,让龙虎大战做庄你 的 龙虎大战做庄 变得更快,接下来龙虎大战做庄龙虎大战做庄我 们 会通过一系列文章来讲解龙虎大战做庄我 是如何使用 Memcached 来深度龙虎大战做庄优化 龙虎大战做庄。

今天讲解第三篇:使用内存缓存 龙虎大战做庄 主循环,实现龙虎大战做庄首页 0 SQL。

如何缓存主循环

龙虎大战做庄 安装 Memcached 之后,龙虎大战做庄 的文章页,基本上可以做到 0 SQL 请求,但是龙虎大战做庄首页 或者其他列表页总是有两条 SQL 请求,怎么龙虎大战做庄优化 呢?

首先在 posts_pre_query filter 基于查询参数 $query_vars 创建缓存的 $cacke_key

并且使用该 $cache_key 查询一下内存中是否已有相关数据,如有直接返回数据,龙虎大战做庄 就不会到数据库查询了。

add_filter('posts_pre_query', function ($pre, $wp_query){
	if(!$wp_query->is_main_query()){	// 只缓存主循环
		return $pre;
	}

	$cache_key	= md5(maybe_serialize($wp_query->query_vars));

	$wp_query->set('cache_key', $cache_key);

	$post_ids	= wp_cache_get($cache_key, 'wpjam_post_ids');

	if($post_ids === false){
		return $pre;
	}

	return wpjam_get_posts($post_ids);
}, 10, 2);

如果前面在内存中没有相关缓存,这个时候 龙虎大战做庄 已经到数据库查询出相关的结果了,使用 posts_results filter 把 龙虎大战做庄 主循环的结果缓存到 memcached。

这样下次 龙虎大战做庄 在此查询相同的数据的时候,在 posts_pre_query filter 就会直接返回。

add_filter('posts_results',	 function ($posts, $wp_query) {
	$cache_key	= $wp_query->get('cache_key');

	if($cache_key){
		$post_ids	= wp_cache_get($cache_key, 'wpjam_post_ids');
		if($post_ids === false){
			wp_cache_set($cache_key, array_column($posts, 'ID'), 'wpjam_post_ids', DAY_IN_SECONDS);
		}
	}

	return $posts;
}, 10, 2);

如何更新缓存

这样缓存之后,最大的问题是文章修改怎么更新缓存呢?因为每次不同查询的 $cache_key 都是不同,且和文章没有任何相关性。期间考虑过把这类的 $cache_key 全部放到一个地方,然后文章有更新,一次性把这些 $cache_key 对应的内存缓存清理掉,但是这样子处理发现还更麻烦。

龙虎大战做庄 中有个 wp_cache_get_last_changed 函数,它使用来存储一类 $cache_group 最后的修改时间,龙虎大战做庄 文章使用的 $cache_group$posts每次文章更新龙虎大战做庄删除 ,或者对应的分类标签修改等等涉及到文章的操作,都会影响该值,龙虎大战做庄 都会该值设置最新的时间戳。

比如下面这段代码就可以获取 $cache_group$posts 的最后修改时间:

$last_changed	= wp_cache_get_last_changed('posts');

如果龙虎大战做庄龙虎大战做庄我 们 把这个 $last_changed 的值合并到缓存的 $cacke_key 中,这样文章修改了,所有的文章列表的缓存也会快速失效。这样龙虎大战做庄龙虎大战做庄我 们 就不用担心因为文章修改而造成数据不一致的问题了。

最终 $cache_key 的设置代码改成:

$cache_key	= 'md5(maybe_serialize($wp_query->query_vars)).':'.wp_cache_get_last_changed('posts');

WPJAM Basic 插件已经集成了 Memcached,龙虎大战做庄下载 WPJAM Basic 之后,将 wpjam-basic/template/ 目录下的 object-cache.php 文件复制到 wp-content 目录下即可。


©龙虎大战做庄我 爱水煮鱼,龙虎大战做庄本站 龙虎大战做庄推荐 使用的主机:阿里云,国外主机建议使用BlueHost

龙虎大战做庄本站 长期承接 龙虎大战做庄 龙虎大战做庄优化 建站业务,要求很高,有兴趣请联系微信:「chenduopapa」或微信龙虎大战做庄公众号 :「龙虎大战做庄果酱」。

龙虎大战做庄热门 文章