WP笔记

WordPress的瞬态缓存和对象缓存

WordPress原生缓存机制主要有两种:瞬态缓存和对象缓存。两者主要区别是生存时间和存储位置不同,瞬态缓存活在一段时间内,这段时间任何一次页面请求都可以使用,存储在数据库中。对象缓存只生存在一次页面请求中,下一次请求就访问不到了,存储在内存中。但两者也不是界限分明的,当WordPress安装了高级缓存,瞬态缓存可以搬到内存里住,对象缓存也能在多次请求中重复使用。下面来详细介绍一下。

首先明确一下使用场景,与瞬态缓存和对象缓存相对应的是页面缓存,顾名思义,页面缓存会保存整个页面,使得页面请求完全不劳烦数据库。而前两者是部分缓存,例如一个复杂的数据库请求结果,一个从rss feed远程获取的数据, 它们仅仅是页面内容的一部分。

瞬态缓存 / Transients

瞬态缓存类似于WordPress的Options API,也是用wp_options存储数据,但增加了一个过期时间特性,从而变成临时存储信息的好地方,信息过期后会被清除并重新生成,所以不要用瞬态缓存存储任何不能重新生成的数据。

瞬态缓存由WordPress管理,当你安装了高级缓存插件,例如memcached插件,它会被存储到访问速度更快的内存中。关于瞬态缓存需要注意的有:

  • 不要假设它存在,它只能保证过期后一定不存在,但过期前也可以不存在。
  • 不要假设它一定存储在数据库里,高级缓存可以改变它的存储位置。
  • 有过期时间的瞬态缓存不能像options那样自动加载,没有过期时间的可以自动加载。
  • 没有高级缓存时,过期的瞬态缓存仅在用户访问并使用这个缓存时才能被删除,删除后会重新生成,这个过程比较慢的话会影响用户体验。

设置、获取和删除瞬态缓存的方法如下:

set_transient( $key, $value, $expiration )
get_transient( $key )
delete_transient( $key )
$key缓存名称,长度要小于172个字符
$value你要缓存的数据
$expiration 生存时间是多少秒,可以使用预定义的常量:
1分钟 – MINUTE_IN_SECONDS
1小时 – HOUR_IN_SECONDS
1天 – DAY_IN_SECONDS
1星期 – WEEK_IN_SECONDS
1个月 – MONTH_IN_SECONDS
1年 – YEAR_IN_SECONDS

典型使用方法:

// 判断缓存数据是否存在,存在就获取,不存在就重新生成
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
    // 缓存不存在,重新生成
    $special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' );
    set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );
}
// 使用数据

对象缓存 / Object Cache

对象缓存默认不是持久化的缓存,仅存在与一次http请求中。什么意思呢?比如说一个很复杂的数据库查询结果,你在header使用了一次,又在footer使用了一次,可以用对象缓存防止重复查询。只有开启memcached等高级缓后对象缓存才能持久生存,所以使用前要想明白自己想要的是什么。

对象缓存支持分组,有了分组概念,不同组的缓存key可以重复。

对象缓存的使用方法:

wp_cache_add( $key, $data, $group, $expire )
wp_cache_set( $key, $data, $group, $expire )
wp_cache_get( $key, $group )
wp_cache_delete( $key, $group )
wp_cache_replace( $key, $data, $group, $expire )
wp_cache_flush()
$key缓存的key,指定要获取的数据
$data你要存储到缓存里的数据
$group组名,让你在不同分组中使用相同的key
$expire生存时间,指定可以存在多少秒,默认0(尽可能长时间的存在)

wp_cache_add()wp_cache_replace()仅在cache不存在时才会写入数据,而wp_cache_set()会写入或覆盖数据。

WordPress 2.5之前,在wp-config.php里写入define('WP_CACHE', true)可以使对象缓存变为持久缓存,现在仅仅定义常量是不够的,还要安装持久缓存的插件:

查看cache状态:

add_action( 'shutdown', function(){
  global $wp_object_cache;
  $wp_object_cache->stats();
});

1条评论

留言

您的电子邮箱地址不会被公开。