中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用php實現令牌桶算法?

發布時間:2020-05-20 18:05:23 來源:億速云 閱讀:376 作者:鴿子 欄目:編程語言

php+redis實現令牌桶算法代碼:

<?phpnamespace Api\Lib;/**
 * 限流控制
 */class RateLimit{
    private $minNum = 60; //單個用戶每分訪問數
    private $dayNum = 10000; //單個用戶每天總的訪問量

    public function minLimit($uid)
    {
        $minNumKey = $uid . '_minNum';
        $dayNumKey = $uid . '_dayNum';
        $resMin    = $this->getRedis($minNumKey, $this->minNum, 60);
        $resDay    = $this->getRedis($minNumKey, $this->minNum, 86400);
        if (!$resMin['status'] || !$resDay['status']) {
            exit($resMin['msg'] . $resDay['msg']);
        }
    }

    public function getRedis($key, $initNum, $expire)
    {
        $nowtime  = time();
        $result   = ['status' => true, 'msg' => ''];
        $redisObj = $this->di->get('redis');
        $redis->watch($key);
        $limitVal = $redis->get($key);
        if ($limitVal) {
            $limitVal = json_decode($limitVal, true);
            $newNum   = min($initNum, ($limitVal['num'] - 1) + (($initNum / $expire) * ($nowtime - $limitVal['time'])));
            if ($newNum > 0) {
                $redisVal = json_encode(['num' => $newNum, 'time' => time()]);
            } else {
                return ['status' => false, 'msg' => '當前時刻令牌消耗完!'];
            }
        } else {
            $redisVal = json_encode(['num' => $initNum, 'time' => time()]);
        }
        $redis->multi();
        $redis->set($key, $redisVal);
        $rob_result = $redis->exec();
        if (!$rob_result) {
            $result = ['status' => false, 'msg' => '訪問頻次過多!'];
        }
        return $result;
    }}

代碼要點:

1、首先定義規則

單個用戶每分鐘訪問次數($minNum),單個用戶每天總的訪問次數($dayNum),接口總的訪問次數等不同的規則。

2、計算速率

該代碼示例以秒為最小的時間單位,速率=訪問次數/時間($initNum / $expire)

3、每次訪問后補充的令牌個數計算方式

獲取上次訪問的時間即上次存入令牌的時間,計算當前時刻與上次訪問的時間差乘以速率就是此次需要補充的令牌個數,注意補充令牌后總的令牌個數不能大于初始化的令牌個數,以補充數和初始化數的最小值為準。

4、程序流程

第一次訪問時初始化令牌個數($minNum),存入Redis同時將當前的時間戳存入以便計算下次需要補充的令牌個數。

第二次訪問時獲取剩余的令牌個數,并添加本次應該補充的令牌個數,補充后如何令牌數>0則當前訪問是有效的可以訪問,否則令牌使用完畢不可訪問。先補充令牌再判斷令牌是否>0的原因是由于還有速率這個概念即如果上次剩余的令牌為0但是本次應該補充的令牌>1那么本次依然可以訪問。

5、針對并發的處理

使用Redis的樂觀鎖機制。

以上就是令牌桶算法如何使用php實現的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

策勒县| 江阴市| 富平县| 绍兴县| 繁昌县| 吴忠市| 商水县| 平顺县| 雅安市| 富川| 虞城县| 芜湖县| 聂荣县| 柏乡县| 界首市| 赤城县| 嫩江县| 沙雅县| 错那县| 定兴县| 博客| 城步| 精河县| 桓台县| 蒲江县| 民县| 黎城县| 邢台市| 龙里县| 揭阳市| 拉孜县| 呈贡县| 泗水县| 疏附县| 惠州市| 长治市| 东丽区| 沈丘县| 周至县| 沛县| 淅川县|