通常来讲,一个项目中老是会有一些较难处理的业务,好比业务复杂花样繁多的搜索,使用搜索系统如sphinx,lucence等来处理的话,数据源的如果变化过快(如顶、踩、浏览数之类),则首先推数据的频率就较难衡量,另外没法精确搜索或排序。因此通常状况下的作法是经过DB进行搜索,而且除了尽可能将业务分解到程序层面外,还会在DB前加一层cache。可是这样作也有很多已知的弊端:php
一、实际上不少业务没法放到普通的PHP中处理,如一些较复杂的排序、筛选,经过普通的PHP来实现的话效率还不如MYSQL。ajax
二、cache的命中率也很差保证,特别是对一些使用关键词进行查询的业务,关键词变化太多。服务器
如果遇到恶意刷的话,DB服务器容易直接挂掉,所以咱们能够在程序层面上加一层限制器,限制并发数,该限制器具有如下特色:并发
一、高效(废话么,不然直接刷限制器就刷爆了)。如今是使用memcache进行原子操做计数,能够扩展成使用其余方法。this
二、精确到action层。能够单独限制单个页面。排序
三、方便。见仁见智吧it
四、成本低廉。包括研发成本与硬件成本。io
根据压测,原先只能100并发的搜索功能,限制100后,压测800结果正常。function
使用方法以下:效率
<?php
/**
* 搜索
*/
public function search(){
//增长计数器功能,超过次数则返回系统繁忙
$viewlimiter = Library::load('viewlimiter');
//访问限制器的名称,请用controller+action,尽可能单个页面保持惟一
$limitName = 'search_search';
//最多同时访问数
$limit = 100;
//如果超过数量则直接返回
if(!$viewlimiter->check($limitName, $limit)) {
ajaxOutput(0, $this->lang->line('multi_search_limit'));
}
/*----复杂变态的业务逻辑-----*/
$xxxModel->search($params);
}
//end func
?>