Maison  >  Article  >  cadre php  >  Comment utiliser le framework Hyperf pour la gestion des verrous distribués

Comment utiliser le framework Hyperf pour la gestion des verrous distribués

WBOY
WBOYoriginal
2023-10-28 09:37:43784parcourir

Comment utiliser le framework Hyperf pour la gestion des verrous distribués

Comment utiliser le framework Hyperf pour la gestion distribuée des verrous

Introduction :
Dans un système distribué, en raison de plusieurs nœuds exécutant simultanément des tâches en même temps, plusieurs nœuds accéderont aux ressources partagées en même temps, ce qui entraînera à l'incohérence des données, à la lecture sale et à d'autres problèmes. Afin de résoudre ce problème, il est souvent nécessaire d’utiliser un mécanisme de verrouillage distribué pour garantir l’exclusivité des ressources. Le framework Hyperf offre un moyen pratique de gérer les verrous distribués.

1. Introduction au framework Hyperf
Hyperf est un framework flexible et performant basé sur des coroutines PHP, adapté à la création rapide d'applications basées sur les données. Il présente les caractéristiques d'un seuil bas, d'une injection de dépendances flexible, d'un conteneur IoC puissant, de hautes performances et de composants standard riches.

2. Principe du verrouillage distribué
Les verrous distribués ont généralement deux méthodes de mise en œuvre : basée sur une base de données et basée sur le cache. La mise en œuvre du verrouillage distribué basé sur une base de données est relativement simple, mais ses performances sont inférieures. Les verrous distribués basés sur le cache sont généralement implémentés à l'aide de services de cache hautes performances tels que Redis ou Memcached, qui offrent des performances et une fiabilité élevées.

3. Le framework Hyperf intègre Redis

  1. Installer l'extension Redis

Pour utiliser l'extension Redis dans l'environnement PHP, vous devez d'abord installer l'extension associée à Redid.

pecl install redis
  1. Ajouter la configuration Redis

Ajouter les paramètres de connexion Redis dans le fichier de configuration du projet Hyperf config/autoload/redis.php : 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');
    }
}

    Configurer Redis Informations de connexion
    1. Ajoutez les informations de connexion Redis suivantes au fichier .env dans le répertoire racine. Faites attention à modifier les paramètres en fonction de la situation réelle :
    <?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. Utilisez le framework Hyperf pour. créer des verrous distribués


    Classe de service de verrouillage

    🎜🎜Créez le fichier LockService.php dans le répertoire app/Utils d'Hyperf pour encapsuler les méthodes liées aux verrous distribués : 🎜rrreee 🎜🎜Utiliser la classe de service de verrouillage 🎜🎜🎜 Lorsque des verrous distribués doivent être utilisés, poussez la classe de service de verrouillage via l'injection de dépendances et utilisez-la. L'exemple suivant montre comment utiliser les verrous distribués pour obtenir un traitement de requête idempotent : 🎜rrreee🎜 5. Résumé. 🎜En intégrant Redis et en encapsulant les classes de services de verrouillage distribué du framework Hyperf, nous pouvons utiliser des verrous distribués simples, fiables et performants pour gérer les ressources partagées dans les systèmes distribués et garantir la cohérence et la fiabilité des données. Dans le même temps, cela améliore également les capacités de traitement simultané du système et l’efficacité du traitement des demandes. Les verrous distribués sont très importants dans les applications pratiques. J'espère que l'introduction de cet article pourra aider les lecteurs à mieux comprendre et utiliser les verrous distribués. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn