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

Mehrere Möglichkeiten zur Implementierung eines Geschwindigkeitsbegrenzers in Redis

尚
nach vorne
2020-03-28 09:29:412570Durchsuche

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)
}

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!

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