分散ロック管理に Hyperf フレームワークを使用する方法

WBOY
リリース: 2023-10-28 09:37:43
オリジナル
874 人が閲覧しました

分散ロック管理に Hyperf フレームワークを使用する方法

分散ロック管理に Hyperf フレームワークを使用する方法

はじめに:
分散システムでは、複数のノードが同時にタスクを実行するため、複数のノードが同時に共有リソースにアクセスすると、データの不整合やダーティ リードなどの問題が発生する可能性があります。この問題を解決するには、多くの場合、分散ロック メカニズムを使用してリソースの排他性を確保する必要があります。 Hyperf フレームワークは、分散ロックを管理する便利な方法を提供します。

1. Hyperf フレームワークの概要
Hyperf は、PHP コルーチンに基づく高性能で柔軟なフレームワークであり、データ駆動型アプリケーションを迅速に構築するのに適しています。低いしきい値、柔軟な依存関係注入、強力な IoC コンテナー、高性能、豊富な標準コンポーネントという特徴があります。

2. 分散ロックの原理
分散ロックには通常、データベース ベースとキャッシュ ベースの 2 つの実装方法があります。データベースベースの分散ロックの実装は比較的単純ですが、パフォーマンスは低下します。キャッシュベースの分散ロックは通常、Redis や Memcached などの高いパフォーマンスと信頼性を備えた高性能キャッシュ サービスを使用して実装されます。

3. Hyperf フレームワークは Redis を統合します

  1. Redis 拡張機能のインストール

PHP 環境で Redis 拡張機能を使用するには、最初に Redid 関連の拡張機能をインストールする必要があります。

pecl install redis
ログイン後にコピー
  1. Redis 構成の追加

Hyperf プロジェクトの構成ファイルに Redis 接続パラメーターを追加します config/autoload/redis.php:

<?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 接続情報の構成

次の Redis 接続情報をルート ディレクトリの .env ファイルに追加します。パラメータは次のように変更するように注意してください。実際の状況:

REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB=0
ログイン後にコピー

4. 分散ロックには Hyperf フレームワークを使用します

  1. ロック サービス クラスを作成します

app 内Hyperf の /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');
    }
}
ログイン後にコピー
  1. ロック サービス クラスを使用します

ロックの分散を使用する必要がある場合は、依存関係注入を通じてロック サービス クラスをプッシュし、それを使用します。次の例は、分散ロックを使用して冪等なリクエスト処理を実現する方法を示しています:

<?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 {
            // 未获得锁,返回重试或失败的响应
        }
    }
}
ログイン後にコピー

5. 概要
合格 Hyperf フレームワークは Redis を統合し、分散ロック サービス クラスをカプセル化します。シンプルで信頼性が高く、高性能な分散ロックを使用して、分散システム内の共有リソースを管理し、データの一貫性と信頼性を確保できます。同時に、システムの同時処理能力とリクエスト処理効率も向上します。分散ロックは実際のアプリケーションでは非常に重要ですが、この記事の紹介が読者の分散ロックの理解と使用に役立つことを願っています。

以上が分散ロック管理に Hyperf フレームワークを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート