通常來講,一個項目中老是會有一些較難處理的業務,好比業務複雜花樣繁多的搜索,使用搜索系統如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
?>