php中通过redis实现接口限速

接口限速的原因

单用户请求接口过快可能造成锁等待超时、数据操作异常等问题。

单服务器下

在单服务器服务环境下,通过开启session基于session的文件锁方式可以很好的避免单个用户请求接口频率过快的问题

负载均衡环境下

多台服务器session数据需要共享,通常会放在一台共享服务器中,如mysql、redis、memcache等,(不建议放在mysql中,很容易造成连接数不够用问题),如此一来就不能像单服务器一样利用session的文件锁方式来控制接口请求频率。

利用redis限制接口请求频率

通过请求计数的方式来解决限制请求频率问题,因为是并发操作,所以须利用原子操作来避免,通过redis的 incr 方法即可实现

<?php

function getRedis()
{
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    return $redis;
}

function getApiLimit($api, $default = '2000')
{
    //接口名称 = 每次请求ms间隔
    $info = [
        'user.info' => '500',
        'user.login' => '1000'
    ];
    return isset($info[$api]) ? $info[$api] : $default;
}

$api = isset($_GET['path']) ? $_GET['path'] : 'main';
$time = getApiLimit($api);
$key = "api_limit_" . $api;
$redis = getRedis();
$num = $redis->incr($key);
if($num == 1) {
    $redis->pExpire($key, $time);
} else {
    exit('api limit');
}
echo 'success';


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值