Heim  >  Artikel  >  PHP-Framework  >  So verwenden Sie das Hyperf-Framework für die verteilte Sperrenverwaltung

So verwenden Sie das Hyperf-Framework für die verteilte Sperrenverwaltung

WBOY
WBOYOriginal
2023-10-28 09:37:43853Durchsuche

So verwenden Sie das Hyperf-Framework für die verteilte Sperrenverwaltung

So verwenden Sie das Hyperf-Framework für die verteilte Sperrenverwaltung

Einführung:
In einem verteilten System greifen mehrere Knoten gleichzeitig auf gemeinsam genutzte Ressourcen zu, was dazu führt, dass mehrere Knoten gleichzeitig Aufgaben ausführen zu Dateninkonsistenzen, Dirty Reading und anderen Problemen. Um dieses Problem zu lösen, ist es häufig erforderlich, einen verteilten Sperrmechanismus zu verwenden, um die Exklusivität von Ressourcen sicherzustellen. Das Hyperf-Framework bietet eine bequeme Möglichkeit, verteilte Sperren zu verwalten.

1. Einführung in das Hyperf-Framework
Hyperf ist ein leistungsstarkes, flexibles Framework auf Basis von PHP-Coroutinen, das sich für die schnelle Erstellung datengesteuerter Anwendungen eignet. Es zeichnet sich durch einen niedrigen Schwellenwert, eine flexible Abhängigkeitsinjektion, einen leistungsstarken IoC-Container, eine hohe Leistung und umfangreiche Standardkomponenten aus.

2. Prinzip der verteilten Sperre
Verteilte Sperren haben normalerweise zwei Implementierungsmethoden: datenbankbasiert und Cache-basiert. Die Implementierung einer datenbankbasierten verteilten Sperre ist relativ einfach, weist jedoch eine geringere Leistung auf. Cachebasierte verteilte Sperren werden normalerweise mithilfe leistungsstarker Cache-Dienste wie Redis oder Memcached implementiert, die über eine hohe Leistung und Zuverlässigkeit verfügen.

3. Hyperf-Framework integriert Redis

  1. Redis-Erweiterung installieren

Um die Redis-Erweiterung in einer PHP-Umgebung zu verwenden, müssen Sie zuerst die Redid-bezogene Erweiterung installieren.

pecl install redis
  1. Redis-Konfiguration hinzufügen

Redis-Verbindungsparameter in der Konfigurationsdatei des Hyperf-Projekts config/autoload/redis.php hinzufügen: config/autoload/redis.php中添加Redis的连接参数:

<?php

declare(strict_types=1);

return [
    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'auth' => env('REDIS_AUTH', null),
        'port' => (int) env('REDIS_PORT', 6379),
        'db' => (int) env('REDIS_DB', 0),
        'pool' => [
            'max_connections' => (int) env('REDIS_MAX_CONNECTIONS', 10),
            'min_connections' => (int) env('REDIS_MIN_CONNECTIONS', 1),
            'connect_timeout' => (float) env('REDIS_CONNECT_TIMEOUT', 1.0),
            'wait_timeout' => (float) env('REDIS_WAIT_TIMEOUT', 3.0),
            'heartbeat' => (int) env('REDIS_HEARTBEAT', -1),
            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
        ],
    ],
];
  1. 配置Redis连接信息

在根目录下的.env文件中添加以下Redis连接信息,注意根据实际情况修改参数:

REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB=0

四、使用Hyperf框架进行分布式锁

  1. 创建锁服务类

在Hyperf的app/Utils目录下创建LockService.php

<?php

declare(strict_types=1);

namespace AppUtils;

use HyperfRedisRedisFactory;
use HyperfUtilsApplicationContext;
use RedisException;

class LockService
{
    /**
     * 获取锁
     * @param string $key 锁的key
     * @param int $expire 过期时间,单位为秒
     * @return bool
     */
    public function lock(string $key, int $expire): bool
    {
        $redis = $this->getRedis();
        try {
            return $redis->set($key, 1, ['nx', 'ex' => $expire]) ? true : false;
        } catch (RedisException $exception) {
            return false;
        }
    }

    /**
     * 解锁
     * @param string $key 锁的key
     * @return bool
     */
    public function unlock(string $key): bool
    {
        $redis = $this->getRedis();
        try {
            return $redis->del([$key]) > 0;
        } catch (RedisException $exception) {
            return false;
        }
    }

    /**
     * 获取Redis实例
     * @return mixed
     */
    private function getRedis()
    {
        $container = ApplicationContext::getContainer();
        return $container->get(RedisFactory::class)->get('default');
    }
}

    Redis konfigurieren Verbindungsinformationen
    1. Fügen Sie die folgenden Redis-Verbindungsinformationen zur Datei .env im Stammverzeichnis hinzu. Achten Sie darauf, die Parameter entsprechend der tatsächlichen Situation zu ändern:
    <?php
    
    declare(strict_types=1);
    
    namespace AppController;
    
    use AppUtilsLockService;
    use HyperfHttpServerAnnotationAutoController;
    
    /**
     * @AutoController()
     */
    class DemoController
    {
        public function index(LockService $lockService)
        {
            // 获取锁
            $lockKey = 'demo_lock';
            $expire = 10; // 过期时间10秒
            if ($lockService->lock($lockKey, $expire)) {
                // 获得锁,执行业务逻辑
                // TODO: 处理业务逻辑
    
                // 释放锁
                $lockService->unlock($lockKey);
            } else {
                // 未获得锁,返回重试或失败的响应
            }
        }
    }

    4. Verwenden Sie das Hyperf-Framework, um Verteilte Sperren erstellen


    Dienstklasse sperren

    🎜🎜Erstellen Sie die Datei LockService.php im Verzeichnis app/Utils von Hyperf, um Methoden im Zusammenhang mit verteilten Sperren zu kapseln: 🎜rrreee 🎜🎜Sperren verwenden Serviceklasse 🎜🎜🎜 Wenn verteilte Sperren verwendet werden müssen, pushen Sie die Sperrdienstklasse durch Abhängigkeitsinjektion und verwenden Sie sie. Das folgende Beispiel zeigt, wie verteilte Sperren verwendet werden, um eine idempotente Anforderungsverarbeitung zu erreichen: 🎜rrreee🎜 5. Zusammenfassung 🎜Durch die Integration von Redis und die Kapselung verteilter Sperrdienstklassen des Hyperf-Frameworks können wir einfache, zuverlässige und leistungsstarke verteilte Sperren verwenden, um gemeinsam genutzte Ressourcen in verteilten Systemen zu verwalten und Datenkonsistenz und -zuverlässigkeit sicherzustellen. Gleichzeitig verbessert es auch die gleichzeitigen Verarbeitungsfähigkeiten des Systems und die Effizienz der Anforderungsverarbeitung. Verteilte Sperren sind in praktischen Anwendungen sehr wichtig. Ich hoffe, dass die Einführung dieses Artikels den Lesern helfen kann, verteilte Sperren besser zu verstehen und zu verwenden. 🎜

Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Hyperf-Framework für die verteilte Sperrenverwaltung. 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