如何利用缓存提高页面加载速度

互联网有一项著名的原则叫“8秒钟原则”,即首页的加载速度超过8秒,有70%的用户就会不耐烦,选择离开。

做网站或APP当然内容是王道,产品提供有价值的内容,才会吸引更多人使用;但如果加载过慢,纵然你的内容再好,也会有相当一部分用户流失。

相对于早期的“静态网页”,现在大家开发网站时都趋向于使用后端语言和数据库通信,为用户实时展现最新文章、最新评论的“动态网页”。这个理念是没错,可当用户访问量增多时,数据库通信将会严重拖慢页面加载速度。假设5秒钟之内有1000名用户访问了你网站的首页,如果你在这5秒没有更新任何内容的话,这1000人访问了1000次数据库,只为了得到一模一样的数据。999次数据库连接通信其实就是在浪费时间和资源。

“动态网页”和数据库的同步其实没必要精确到分和秒。服务器端如果有一个10分钟的缓存机制,将大大减少用户访问时的加载时间。据我的经验,有数据库通信,加载需要3秒钟的页面,使用缓存后可以缩短至600毫秒之内。

php里有一个很轻量、实用的工具叫phpfastcache,用起来简单的不要不要的,只需要$cache->get来获取缓存过的值,如果这个值不存在,那就去数据库里把它抓取出来,用$cache->set把值存入就好了。接下来的10分钟,所有用户访问都在服务器就可以解决,不用连数据库了。当然如果数据不会经常变化的话,缓存有效时间可以设置更久。

$results = $cache->get("identity_keyword");

if($results == null) {
    $results = cURL->get("http://www.youtube.com/api/json/url/keyword/page");
    // Write to Cache Save API Calls next time
    $cache->set("identity_keyword", $results, 60*10);
}

如何按相似标签(类别)的数量来排列相关文章?

如何在Wordpress网站的单页post或是custom post type(CPT) 中显示相关推荐?网上有很多教程教你怎么做。大体都是先得到当前post的类别或标签,然后到数据库里抓有相同标签的post出来。

对于一个小的、文章类型单一的博客,这种方法足够了,但对于结构复杂,同一篇post有多个标签时,我们要在有限的空间(一般不会超过10条)为用户提供最有价值的内容,就涉及优先级和排序的问题。如何判断一篇post和当前post的相关程度呢?

我能想到的最好办法就是按他们相同标签的数量来排序了。下面是我在名为商户(”business”)的CPT中显示相关商户推荐的例子。

首先,用wp_get_object_terms 得到当前商户的所有类别和标签数组,将其implode为string,然后运行query语句得出相关商户,按相同类别和标签数量多少来排序。

SELECT ID, COUNT(*) AS total_count, post_title  FROM `wp_posts` 
LEFT JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
LEFT JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.ID!=343131 AND wp_posts.post_type='business' AND wp_posts.post_status='publish' AND wp_terms.name IN ('中餐','粤港菜','茶餐厅简餐','奶茶甜点','果汁饮品','咖啡烘焙','早茶点心')
GROUP BY wp_posts.ID
ORDER BY total_count DESC

Mysql并列条件筛选用OR还是IN

假设有一个叫business的table储存了大温地区的全部商户信息,其中有一栏city储存城市信息。我想提取出温哥华、列治文、本那比以及素里的商户,应该如何写query?

之前碰到这样的筛选类型,我一直用的是OR语句,类似这样的形式

WHERE city=’Vancouver’ OR city=’Burnaby’ …

昨天和同事交流,才知道原来还有一种IN语句更简洁高效

WHERE city IN (‘Vancouver’, ‘Burnaby’ …)

stackoverflow 上有人做了实验,IN语句运行速度比OR至少快一倍。

用INSERT INTO … SELECT 命令复制数据

从一个数据表把数据复制到另外一个数据表原来如此简单。今天工作时需要把一个表格的数据作为新数据新建到另外一个数据表中,上网查了一下,最后是这样做的。

INSERT INTO new_table (col1, col2, col3, col4 …)

SELECT col1,’1′, ‘P’, col22

FROM old_table

特殊情况:如果我想插入同一个值怎么办?比如table里有status一栏,我想所有新插入的都有status=’P’。那么我直接在Query中的Select对应的那一栏写”p”,而不是写column name就好了。(上面Query中“1”和“P”就是这样用的)

我如果想在新表中多个栏插入旧表中同一个栏的值怎么办?比如我在新表中有date_created, date_created_local, date_posted三个栏,都想写为旧表中date_created_UTC的值。那么我就只要重复date_created_UTC的Column name在SELECT 语句中就好了。

原来复制数据是这么简单的一个query,今天学习了。