0
0
0
---
使用 SSDB 来实现操作频率限制
ideawu 发表于 2015年03月10日 17:49 | Hits: 2196
在 Web 开发中, 经常需要实现操作频率限制的功能, 以避免单个用户过度地消耗某项资源, 或者消除安全隐患. 例如, 限制某 IP 刷新页面的频率, 限制一个用户投票只能投一次, 等等.
要实现操作频率限制, 就要用到存储. 使用SSDB来存储, 可以支持海量用户的操作频率限制, 而且代码非常简洁高效.
// 操作次数限制函数: 限制 uid 在 period 秒内能操作 action 最多 max_count 次. // 如果超过限制, 返回 false. static function act_limit($uid, $action, $max_count, $period){ $now = time(); $expire = intval($now / $period) * $period + $period; $ttl = $expire - $now; $key = "act_limit|$uid|$action"; $count = Util::ssdb()->incr($key); Util::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{ // 正常操作 }
Related posts:
我要给这篇文章打分:
可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.