Redis bietet mehrere Möglichkeiten, den Geschwindigkeitsbegrenzer zu implementieren.
GET + INCR + EXPIRE
Ermitteln Sie zuerst den aktuellen Wert des Schlüssels. Wenn dieser den Grenzwert nicht überschreitet, führen Sie dann INCR aus und erhöhen Sie ihn um 1. Wenn Schlüssel Existiert nicht, verwenden Sie den Redis-Transaktionsinitialisierungsschlüssel und die Ablaufzeit.
(Empfohlen: Redis-Video-Tutorial)
Pseudocode:
count = redis.GET(key) if redis return nil { redis.MULTI redis.INCR(key) redis.EXPIRE(key, expire_time) redis.EXEC count = 1 } if count > limit { return 超出限制 } else { redis.INCR(key) }
Probleme bei hoher Parallelität:
Wenn 10 gleichzeitig Zur gleichen Zeit Wenn ein gleichzeitiges Programm GET ausführt und Null zurückgibt, führen diese 10 gleichzeitigen Programme die Redis-Transaktion aus, um den Schlüssel um eins zu erhöhen, aber der Zählwert jedes Programms ist 1. Wenn der durch limit festgelegte Wert kleiner als 10 ist, dann wird das tatsächlich ausgeführte Programm Der Grenzwert wurde überschritten. Wenn Redis nach der Ausführung der Transaktion erneut überprüft und der Zählung zugewiesen wird, kann jedes Programm 10 zurückgeben, sodass kein Programm weiter ausgeführt werden kann.
Wenn der Schlüssel bereits vorhanden ist, kann die Logik von GET zuerst und dann INCR auch dazu führen, dass die Anzahl der tatsächlich ausgeführten Programme den Grenzwert überschreitet.
INCR + EXPIRE
INCR zuerst. Wenn der Wert 1 ist, bedeutet dies, dass der Schlüssel gerade festgelegt wurde, und führen Sie dann EXPIRE aus
Pseudo Code:
count = redis.INCR(key) if count == 1 { redis.EXPIRE(key, expire_time) } if count > limit { return 超出限制 }
Mit Vorsicht verwenden
Wenn das Programm hängt, nachdem INCR und EXPIRE nicht ausgeführt wurden, hat der Schlüssel keine Ablaufzeit. Die spezifischen Auswirkungen hängen von den Anforderungen ab.
Lua-Skript
local current current = redis.call("incr",KEYS[1]) if tonumber(current) == 1 then redis.call("expire",KEYS[1],1) end
Weitere Redis-Kenntnisse finden Sie in der Spalte Redis-Einführungs-Tutorial.
Das obige ist der detaillierte Inhalt vonMehrere Möglichkeiten zur Implementierung eines Geschwindigkeitsbegrenzers in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!