Heim > Datenbank > Redis > Mehrere Möglichkeiten zur Implementierung eines Geschwindigkeitsbegrenzers in Redis

Mehrere Möglichkeiten zur Implementierung eines Geschwindigkeitsbegrenzers in Redis

Freigeben: 2020-03-28 09:29:41
nach vorne
2630 Leute haben es durchsucht

Mehrere Möglichkeiten zur Implementierung eines Geschwindigkeitsbegrenzers in Redis

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)
}
Nach dem Login kopieren

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 超出限制
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:oschina.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage