+
95
-

php如何用redis来实现接口限流?

请问php如何用redis来实现接口限流?


网友回复

+
15
-

1、incr单位时间内可以执行多少次

<?php
function checkrequest($_actkey) {
    $_limitsecond = 60;//单位时间 秒
    $concurrencyKey = "testincr".$_actkey;
    $_limitcount = 5;//可执行次数
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $_count = $redis->incr($concurrencyKey);
    if ($_count > $_limitcount) {
        return false;
    } else {
        if ($_count == 1) {
            $redis->expire($concurrencyKey, $_limitsecond);//设置过期时间
        }
        return true;
    }
}

echo time();
var_dump(checkrequest("test"));
var_dump(checkrequest("test"));
var_dump(checkrequest("test"));
var_dump(checkrequest("test"));
echo time();

var_dump(checkrequest("test"));
echo time();
var_dump(checkrequest("test"));
e...

点击查看剩余70%

+
15
-

3、还有一种办法,就是每次请求在redis的set集合中插入一个随机值,score为当时的时间,然后排序获取这段时间内的请求数量,代码如下

<?php
function checkrequest($_actkey) {
    $_timeseconds = 5;//5秒内
    $_timescount = 5; //智能访问5次
    $zSetKey = "test12123".$_actkey;
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $nowtime = time();

    $startTime = $nowtime- $_timeseconds;
    $requestHistory = $redis->zRa...

点击查看剩余70%

我知道答案,我要回答