需求和现状
我们的平台(php网站)由于业务日益负载,导致部分页面承载着很重的数据库查询压力,例如首页涉及很多的联表查询,业务详情页涉及一些鉴权和多表查询,我称之为“重页面”,为了提高查询速度,我决定使用业务缓存方法来处理一层。
解决方法
平台的后端返回的都是json串,所以将json串作为value,前缀加页面标识(例如服务id等)作为key,存储json串。第一次请求时候做set动作,有效期为1小时,这一小时内均get该值。
部分代码:
$mclient = Sap_Common_MClient::getInstance();
$rs = $mclient->get($key);
// 有缓存的话先从缓存中取
if ($rs !== false){
// echo "111111";
$serviceDetail = $rs;
//清理昨天的缓存
$yesterdayDate = date('Y-m-d',time()-Sap_Common_Constants::TIME_DAY_DURATION);
$key_yesterday = 'serviceDetail_'.$yesterdayDate;
$rs_yesterday = $mclient->delete($key);
} else {
// echo "222222";
$serviceDetail = $dataServiceOper->queryServiceDetailById($serviceId, $uid);
$rsMemcached = $serviceDetail;
$expireTime = 3600;
$mclient->set($key,$rsMemcached,$expireTime);
}
注意点
- 变更频率很高并且实时性要求较强的数据(例如发出一条评论),别这么缓存,例如访问量、评论等等,最好能单拉接口让前端获取,或者单独请求,与缓存json做拼接。
- 变更频率不高的数据(可能要求实时性),需要在变更动作作出时候,清理缓存,例如一些详情内容变更、首页产品位排序变更等等,可以通过清楚缓存,使得变更立即生效。