Heim  >  Artikel  >  Backend-Entwicklung  >  PHP+Redis löst das praktische Problem der Auftragsflussbeschränkung

PHP+Redis löst das praktische Problem der Auftragsflussbeschränkung

藏色散人
藏色散人nach vorne
2021-08-23 14:52:513459Durchsuche

1. Jede Ausgabe dieser Artikelreihe wird ein praktisches Redis-Problem lösen.
2. Die Fragen zu jeder Ausgabe werden aus den Kommentaren jeder Ausgabe ausgewählt. Die Fragen beziehen sich auf Redis Bei anderen Fragen schließe ich nicht aus, eine neue Serie zu starten
4. Die Lösung ist daher hauptsächlich PHP
5 Wenn es keine passenden Fragen in den Kommentaren gibt, stelle ich mir selbst Fragen

Problem Beschreibung: ...

<?php

    /**
     * 是否允许放行
     * @param string $key       redis键前缀
     * @param int $timeInterval 时间间隔(秒)
     * @param int $max          时间间隔内最大放行数
     * @return bool             是否放行
     * @throws Exception
     * @example
     * <pre class="brush:php;toolbar:false">
     * //每秒放行一个
     * isAllow('my_allow');
     *
     * //每秒放行3个
     * isAllow('my_allow',1,3);
     *
     * //每3秒放行2个
     * isAllow('my_allow',3,2);
     */
    function isAllow(string $key, int $timeInterval=1, int $max=1):bool{
        if($timeInterval<1){
            throw new Exception(&#39;时间间隔必须大于0&#39;);
        }
        if($max<1){
            throw new Exception(&#39;最大放行数必须大于0&#39;);
        }

        $redis=new Redis();
        $redis->connect('192.168.31.187');
        if(!$redis->isConnected()){
            throw new Exception('Redis服务连接失败');
        }

        //对时间戳取模,使得每$timeInterval秒取得同一个时间戳
        $time=time();
        $key.=':'.($time-($time%$timeInterval));

        //自增并返回自增后的结果
        $index=$redis->incr($key);

        //如果是第一个访问,设置键的过期时间
        if($index===1){
            $redis->expire($key,$timeInterval+1);
        }

        return $index<$max+1;
    }

Code-Interpretation:

Modulieren Sie die Zeit so, dass der Schlüsselname jedes $timeInterval einmal pro Sekunde aktualisiert wird.

incr()-Methode, um den Wert des Schlüssels zu erhöhen. Erstellen Sie zuerst einen Schlüssel mit dem Wert 0 und erhöhen Sie ihn dann automatisch.

  • Nach dem Prinzip des automatischen Inkrementierens wird die Zahl unter demselben Schlüsselnamen angezeigt. Der Wert, der N-mal beim automatischen Inkrementieren zurückgegeben wird, ist N

  • Der Schlüsselname wird alle $timeInterval Sekunden aktualisiert, sodass der Schlüssel nach $timeInterval+1 Sekunde nach Erstellung des Schlüssels keinen Wert mehr hat.

    Empfohlen: „
  • PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonPHP+Redis löst das praktische Problem der Auftragsflussbeschränkung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen