使用 SSDB 來實現操作頻率限制

jopen 9年前發布 | 11K 次閱讀 SSDB

原文  http://www.ideawu.net/blog/archives/864.html


在 Web 開發中, 經常需要實現操作頻率限制的功能, 以避免單個用戶過度地消耗某項資源, 或者消除安全隱患. 例如, 限制某 IP 刷新頁面的頻率, 限制一個用戶投票只能投一次, 等等.

要實現操作頻率限制, 就要用到存儲. 使用 SSDB 來存儲, 可以支持海量用戶的操作頻率限制, 而且代碼非常簡潔高效.

// 操作次數限制函數: 限制 uid 在 ttl 秒內能操作 action 最多 max_count 次.
// 如果超過限制, 返回 false.
function act_limit($uid, $action, $max_count, $ttl){
  $key = "act_limit|$uid|$action";
  $count = $ssdb->incr($key);
  if($count == 1){
    $ssdb->expire($key, $ttl);
  }
  if($count === false || $count > $max_count){
    return false;
  }
  return true;
}

如代碼注釋, 這段代碼可直接用于操作頻率限制, 其中 uid 參數不一定是用戶的 UID, 可以是任意的區別用戶身份的字符串, 可以是 IP 地址, 郵件地址, 手機號等等.

SSDB 的 incr 是原子操作, 所以即使并發執行這個函數, 也不會有問題.

而且, 也不一定是限制用戶的操作頻率, 也可以限制某個資源的訪問頻率, 如限制某個手機號發送驗證碼的次數, 無論是哪個用戶操作的, 可避免對同一個手機號的騷擾.

用法如下:

$test = act_limit($ip, 'login', 3, 60);
if(!$test){
  // 超過頻率限制
}else{
  // 正常操作
}

</div> </div>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!