Heim >PHP-Framework >Denken Sie an PHP >ThinkPHP6 Distributed Lock-Implementierungshandbuch: Lösen von Parallelitätsproblemen

ThinkPHP6 Distributed Lock-Implementierungshandbuch: Lösen von Parallelitätsproblemen

WBOY
WBOYOriginal
2023-08-13 20:00:411860Durchsuche

ThinkPHP6 Distributed Lock-Implementierungshandbuch: Lösen von Parallelitätsproblemen

ThinkPHP6 Distributed Lock-Implementierungsleitfaden: Parallelitätsprobleme lösen

Einführung:
In einem System mit gleichzeitigem Zugriff kommt es häufig vor, dass mehrere Benutzer oder Prozesse gleichzeitig auf derselben Ressource arbeiten, was einen Mechanismus erfordert Gewährleistung eines sich gegenseitig ausschließenden Zugriffs auf Ressourcen. Die verteilte Sperre ist ein Mechanismus zur Lösung von Parallelitätsproblemen. Sie kann sicherstellen, dass nur ein Thread gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen kann.

In diesem Artikel wird erläutert, wie Sie Redis als Backend-Speicher im ThinkPHP6-Framework verwenden, um verteilte Sperren zu implementieren. Anhand von Codebeispielen hilft es den Lesern, die Prinzipien verteilter Sperren und ihre Anwendung in tatsächlichen Projekten zu verstehen.

1. Das Prinzip der verteilten Sperre
Das Implementierungsprinzip der verteilten Sperre ist sehr einfach. Die Kernidee besteht darin, den Zugriff auf den kritischen Abschnitt über eine gemeinsam genutzte Ressource zu steuern. Wenn ein Thread auf den kritischen Abschnitt zugreifen möchte, versucht er zunächst, die Sperre zu erhalten. Wenn die Sperre erfolgreich ist, kann er auf den kritischen Abschnitt zugreifen. Wenn die Sperre nicht erfolgreich ist, muss er darauf warten, dass andere Threads die Sperre aufheben versuchen Sie es erneut.

In Redis können Sie den SETNX-Befehl verwenden, um verteilte Sperren zu implementieren. Mit dem Befehl SETNX wird ein Schlüssel-Wert-Paar festgelegt. Wenn der Schlüssel nicht vorhanden ist, ist die Einstellung erfolgreich und 1 wird zurückgegeben. Wenn der Schlüssel bereits vorhanden ist, schlägt die Einstellung fehl. Mit dieser Funktion kann die Implementierung verteilter Sperren auf die folgenden Schritte vereinfacht werden:

  1. Versuchen Sie, die Sperre über den SETNX-Befehl zu erhalten. Wenn 1 zurückgegeben wird, bedeutet dies, dass die Erfassung erfolgreich ist und Sie den kritischen Abschnitt betreten können
  2. Wenn der SETNX-Befehl 0 zurückgibt, bedeutet dies, dass die Sperre von anderen Threads belegt wurde.
  3. Geben Sie den kritischen Abschnitt ein, um den Vorgang auszuführen. Rufen Sie den Befehl DEL auf, um die Sperre aufzuheben.
  4. 2. Verteilte Sperren in ThinkPHP6 verwenden

Redis-Erweiterung installieren

Bevor Sie Redis als Back-End-Speicher verwenden, müssen Sie zunächst die Redis-Erweiterung installieren. Sie können es mit dem folgenden Befehl installieren:
  1. composer require topthink/think-redis

  2. Redis-Konfiguration festlegen
In der Datei config/database.php fügen Sie Redis-Konfigurationsinformationen hinzu:
  1. 'redis' => [
        'host'       => '127.0.0.1',
        'port'       => 6379,
        'password'   => '',
        'select'     => 0,
        'timeout'    => 0,
        'expire'     => 0,
        'persistent' => false,
        'prefix'     => '',
    ],

  2. Verteilte Sperren verwenden
In ThinkPHP6 können Sie die Redis-Klasse verwenden Implementieren Sie verteilte Sperren. Das Folgende ist ein Beispielcode:
  1. <?php
    namespace appcontroller;
    
    use thinkacadeRedis;
    
    class Index
    {
        public function index()
        {
            // 获取锁的键名
            $lockKey = 'my_lock';
    
            // 尝试获取锁
            $result = Redis::setnx($lockKey, 1);
            if ($result) {
                // 获取锁成功,进入临界区
    
                // 执行操作...
    
                // 释放锁
                Redis::del($lockKey);
            } else {
                // 获取锁失败,等待一段时间后再次尝试
                sleep(1);
                $this->index();
            }
        }
    }

    Verwenden Sie im obigen Beispielcode zunächst die setnx-Methode, um zu versuchen, die Sperre zu erhalten. Wenn 1 zurückgegeben wird, bedeutet dies, dass die Sperre erfolgreich erworben wurde und der kritische Abschnitt zur Ausführung eingegeben wird Wenn 0 zurückgegeben wird, bedeutet dies, dass die Sperre aufgehoben wurde. Andere Threads sind belegt. Warten Sie eine Sekunde und versuchen Sie es erneut. Verwenden Sie nach dem Ausführen des Vorgangs die Methode del, um die Sperre aufzuheben.
Es ist zu beachten, dass es aufgrund von Netzwerkverzögerungen und konkurrierenden Faktoren zu einem Erfassungsfehler beim Versuch, die Sperre zu erhalten, kommen kann. Daher muss eine angemessene Wiederholungsstrategie festgelegt werden.

Zusammenfassung:

In diesem Artikel wird die Methode zur Verwendung von Redis zum Implementieren verteilter Sperren im ThinkPHP6-Framework vorgestellt. Der Erwerb und die Freigabe verteilter Sperren können einfach über den Befehl setnx erreicht werden. Wenn in tatsächlichen Projekten mehrere Benutzer oder Prozesse gleichzeitig auf derselben Ressource arbeiten, können durch die Verwendung verteilter Sperren Parallelitätsprobleme wirksam vermieden und die Systemleistung und -zuverlässigkeit verbessert werden.

Durch die Beherrschung der Prinzipien verteilter Sperren und ihrer Anwendung in ThinkPHP6 können Entwickler verteilte Sperren besser nutzen, um gemeinsam genutzte Ressourcen zu schützen und die gleichzeitigen Verarbeitungsfähigkeiten des Systems zu verbessern. Gleichzeitig muss in tatsächlichen Anwendungen die Wiederholungsstrategie entsprechend den spezifischen Geschäftsanforderungen und der Leistungsoptimierung angemessen konfiguriert werden, um Systemstabilität und hohe Verfügbarkeit sicherzustellen.

Das obige ist der detaillierte Inhalt vonThinkPHP6 Distributed Lock-Implementierungshandbuch: Lösen von Parallelitätsproblemen. 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