在家太无聊了,写一个redis实现限流,最主要功能实现用户10秒内只能请求5次。(都是些基础的东西)
大概逻辑:用户刷新一次页面,redis把当前时间推进list队列,队列设置过期时间为10秒。如果当前队列长度大于5,则判断当前时间减去最新推进队列的时间是否小于10,如果小于10,则请求频繁,请稍后再试。
贴上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?php /** * 实现限流功能 * 10秒内只能请求5次 */ //连接redis服务器 $redis = new redis(); $redis->connect('127.0.0.1',6379);
//获取客户端ip $ip = $_SERVER['REMOTE_ADDR']; //设置次数 $limit = 5;
//判断当前ip的访问次数是否小于5 if($redis->llen($ip)<$limit){ //列表推进队列 $redis->lpush($ip,time()); //设置过期时间 $redis->expire($ip,10); echo '正常访问'; }else{ //获取最新推进列表的时间 $lasttime = $redis->lIndex($ip,0); //如果当前时间减去最后请求时间小于10秒,说明10秒时间还没过 if(time()-$lasttime<20){ exit('请求频繁,请稍后重试'); } } echo "<pre>"; var_dump($redis->lRange($ip,0,-1));
|