redis 实现限流

在家太无聊了,写一个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));