Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung von Redis zur Implementierung verteilter Sperren in PHP

Verwendung von Redis zur Implementierung verteilter Sperren in PHP

WBOY
WBOYOriginal
2023-05-15 15:51:242584Durchsuche

Mit der rasanten Entwicklung des Internets und dem starken Anstieg der Website-Besuche ist die Bedeutung verteilter Systeme allmählich in den Vordergrund gerückt. In verteilten Systemen sind zwangsläufig Probleme der Parallelitätssynchronisation und der Datenkonsistenz verbunden. Verteilte Sperren als Mittel zur Lösung von Parallelitätssynchronisationsproblemen werden in verteilten Systemen nach und nach weit verbreitet eingesetzt. In PHP kann Redis zur Implementierung verteilter Sperren verwendet werden, die in diesem Artikel vorgestellt werden.

Was ist eine verteilte Sperre?

Wenn in einem verteilten System mehrere Maschinen dieselbe Aufgabe gemeinsam verarbeiten, muss die Ressource gesperrt werden, um zu vermeiden, dass mehrere Maschinen gleichzeitig mit derselben Ressource arbeiten. Die verteilte Sperre ist ein Mechanismus zum Sperren gemeinsam genutzter Ressourcen in einem verteilten System. Verteilte Sperren müssen die folgenden zwei Anforderungen gewährleisten:

1. Gegenseitige Exklusivität: Es kann immer nur ein Client die Sperre halten.

2. Wiedereintritt: Derselbe Client kann die Sperre mehrmals erwerben.

Es gibt viele Möglichkeiten, verteilte Sperren zu implementieren, z. B. die Verwendung von Datenbanken, die Verwendung von Zookeeper usw. In diesem Artikel wird eine Methode zur Verwendung von Redis zum Implementieren verteilter Sperren vorgestellt.

Das von Redis implementierte Prinzip der verteilten Sperre

Redis ist ein leistungsstarkes Schlüsselwertspeichersystem, das mehrere Datenstrukturen unterstützt. In Redis kann der SET-Befehl zum Implementieren verteilter Sperren verwendet werden. Das Implementierungsprinzip lautet wie folgt:

1 Der Client sendet den SETNX-Befehl an Redis.

2. Der Redis-Server verarbeitet den empfangenen SETNX-Befehl und stellt fest, ob der angegebene Schlüssel vorhanden ist. Wenn er nicht vorhanden ist, wird der Wert des Schlüssels auf die Client-ID gesetzt und die Ablaufzeit festgelegt. Wenn es vorhanden ist, wird der Fehler direkt zurückgegeben.

3. Der Client empfängt das von Redis zurückgegebene Ergebnis und stellt fest, ob er die Sperre erfolgreich erworben hat. Wenn dies fehlschlägt, wartet er eine Zeit lang und sendet die Anfrage erneut.

Schritte zur Verwendung von Redis zum Implementieren verteilter Sperren

1. Mit Redis verbinden

In PHP wird die PHPRedis-Erweiterung verwendet, um eine Verbindung zu Redis herzustellen, und Sie müssen die Erweiterung installieren, bevor Sie sie verwenden können. Informationen zu bestimmten Installationsmethoden finden Sie in der offiziellen Dokumentation.

2. Sperren erwerben

Implementieren Sie eine Funktion zum Erwerb von Sperren wie folgt:

protected function lock($lock_key, $expire_time = 5)
{
    $redis = new Redis();
    $redis->connect('localhost', 6379); // 连接Redis
    $micro_second = 1000000;
    $timeout = 10 * $micro_second; //等待锁超时时间

    while($timeout >= 0)
    {
        $microtime = microtime(true);
        $timeout -= $micro_second;
        $current_lock_time = $microtime + $expire_time + 1; //锁过期时间

        if($redis->setnx($lock_key, $current_lock_time)) //获取锁成功
        {
            $redis->expire($lock_key, $expire_time); //设置过期时间,防止死锁
            return $current_lock_time;
        }

        //检查锁是否过期
        $lock_time = $redis->get($lock_key);
        if($lock_time < $microtime)
        {
            $new_lock_time = $microtime + $expire_time + 1; //设置新的过期时间
            $old_lock_time = $redis->getset($lock_key, $new_lock_time); //获取旧的过期时间并设置新的过期时间
            if($old_lock_time < $microtime) //锁已经过期,获取锁成功
            {
                $redis->expire($lock_key, $expire_time); //设置过期时间,防止死锁
                return $new_lock_time;
            }
        }

        //等待一段时间后再次尝试获取锁
        usleep(10000); //等待10毫秒
    }

    return false;
}

Die Funktion dieser Funktion besteht darin, die Sperre des angegebenen Schlüssels zu erwerben. Wenn die Erfassung erfolgreich ist, wird die Ablaufzeit der Sperre zurückgegeben ; Wenn die Erfassung fehlschlägt, wird false zurückgegeben.

3. Sperre aufheben

Die Sperre muss aufgehoben werden, unabhängig davon, ob der Vorgang nach erfolgreicher Erlangung der Sperre abgeschlossen wurde oder ob die Sperre nach einer gewissen Zeit fehlgeschlagen ist. Implementieren Sie eine Funktion zum Freigeben der Sperre wie folgt:

protected function unlock($lock_key, $current_lock_time)
{
    $redis = new Redis();
    $redis->connect('localhost', 6379); // 连接Redis
    
    $lock_time = $redis->get($lock_key);
    if($lock_time == $current_lock_time) //判断是否为当前持有锁的客户端
        $redis->del($lock_key); //释放锁
}

Die Funktion dieser Funktion besteht darin, die Sperre des angegebenen Schlüssels freizugeben. Nur der Client, der derzeit die Sperre hält, kann die Sperre freigeben.

Hinweise

1. Die Ablaufzeit der Sperre sollte entsprechend der tatsächlichen Situation angemessen eingestellt werden. Wenn die Ablaufzeit der Sperre zu kurz ist, läuft die Sperre möglicherweise ab oder kann nicht häufig abgerufen werden. Wenn die Ablaufzeit der Sperre zu lang ist, kann die Ablaufzeit der Sperre zu lang sein, was sich auf die Systemleistung auswirkt.

2. Achten Sie beim Festlegen der Ablaufzeit darauf, einen Deadlock zu verhindern. Wenn ein Client die Sperre erhält, die Sperre jedoch aufgrund eines unerwarteten Beendens oder Absturzes nicht freigegeben wird, wirkt sich dies auf andere Clients aus, die die Sperre erhalten, was zu einem Deadlock-Problem führt.

3. Da die Implementierung verteilter Sperren auf der eindeutigen Identität des Clients beruht, müssen verschiedene Clients unterschiedliche Identitäten verwenden, da sonst ein Client möglicherweise die Sperren anderer Clients freigibt. In PHP können Sie PHP_SESSION_ID oder IP-Adresse/Prozess-ID als eindeutige Kennung des Clients verwenden.

Fazit

Die Verwendung von Redis zur Implementierung verteilter Sperren ist eine relativ einfache und praktische Lösung für verteilte Sperren in PHP. In praktischen Anwendungen ist es notwendig, die Ablaufzeit der Sperre entsprechend der tatsächlichen Situation angemessen einzustellen, um Deadlock-Probleme zu vermeiden und die Stabilität und Zuverlässigkeit des Systems sicherzustellen. Gleichzeitig muss darauf geachtet werden, die Eindeutigkeit der eindeutigen Kennung des Kunden sicherzustellen, um mögliche Probleme zu vermeiden.

Das obige ist der detaillierte Inhalt vonVerwendung von Redis zur Implementierung verteilter Sperren in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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