为什么不用Mysql来做?
MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取需要IO操作,所以速度较慢
Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
代码实现:
代码转载自:https://guihet.com/redisip.html
1.新建一个文件IPRestrict.php
<?php
/**
* PHP实现redis限制单ip、单用户的访问次数功能
**/
class IPRestrict {
/**
* @var Redis
*/
private static $redis;
/**
* @var string
* 取客户端真实ip地址作为key
*/
private static $realip;
public function __construct($host = '127.0.0.1', $port = 6379, $auth = null) {
self::$redis = new Redis();
self::$redis->connect('127.0.0.1', 6379);
$auth && self::$redis->auth($auth);
self::$realip = self::getRealIP();
}
/**
* 取得客户端IP地址
* @return string
*/
public static function getRealIP() {
$realip = "";
if (isset($_SERVER)) {
foreach(['HTTP_X_FORWARED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'] as $name) {
if (isset($_SERVER[$name])) {
$realip = $_SERVER[$name];
break;
}
}
} else {
$realip = getenv('HTTP_X_FORWARDED_FOR') || getenv('HTTP_CLIENT_IP') || getenv('REMOTE_ADDR');
}
return $realip;
}
/**
* 记录该ip的访问次数 也可改成用户id
* @param int $limit 限制指定时间内的访问磁珠
* @param int $time 限制时间为60秒
* @return int
* @throws HttpException
*/
public function requestCount($limit = 120, $time = 60) {
$key = self::$realip;
$redis = self::$redis;
/**
* @var bool
*/
$exists = $redis->exists($key);
$redis->incr($key);
if ($exists) {
$count = $redis->get($key);
if ($count > $limit) {
die('请求太频繁,请稍后再试!'.$count);
}
} else {
// 首次计数 设定过期时间
$redis->expire($key, $time);
}
// return $redis->get($key);
}
}
?>
2.在你需要限制的API文件内加上
<?php
include 'IPRestrict.php';
$restrict = new IPRestrict();
echo $restrict->requestCount();
?>
© 版权声明
THE END
暂无评论内容