Rumah  >  Artikel  >  rangka kerja php  >  Cara menggunakan rangka kerja Hyperf untuk pengurusan kunci teragih

Cara menggunakan rangka kerja Hyperf untuk pengurusan kunci teragih

WBOY
WBOYasal
2023-10-28 09:37:43853semak imbas

Cara menggunakan rangka kerja Hyperf untuk pengurusan kunci teragih

Cara menggunakan rangka kerja Hyperf untuk pengurusan kunci teragih

Pengenalan:
Dalam sistem teragih, disebabkan berbilang nod melaksanakan tugas secara serentak pada masa yang sama, berbilang nod akan mengakses sumber dikongsi pada masa yang sama, yang akan membawa kepada ketidakkonsistenan data, bacaan kotor dan isu-isu lain. Untuk menyelesaikan masalah ini, selalunya perlu menggunakan mekanisme kunci yang diedarkan untuk memastikan keeksklusifan sumber. Rangka kerja Hyperf menyediakan cara yang mudah untuk mengurus kunci yang diedarkan.

1. Pengenalan kepada rangka kerja Hyperf
Hyperf ialah rangka kerja fleksibel berprestasi tinggi berdasarkan coroutine PHP, sesuai untuk membina aplikasi dipacu data dengan cepat. Ia mempunyai ciri-ciri ambang rendah, suntikan pergantungan fleksibel, bekas IoC yang berkuasa, prestasi tinggi dan komponen standard yang kaya.

2. Prinsip kunci teragih
Kunci teragih biasanya mempunyai dua kaedah pelaksanaan: berasaskan pangkalan data dan berasaskan cache. Pelaksanaan kunci teragih berasaskan pangkalan data agak mudah, tetapi mempunyai prestasi yang lebih rendah. Kunci teragih berasaskan cache biasanya dilaksanakan menggunakan perkhidmatan cache berprestasi tinggi seperti Redis atau Memcached, yang mempunyai prestasi tinggi dan kebolehpercayaan.

3. Rangka kerja Hyperf menyepadukan Redis

  1. Pasang sambungan Redis

Untuk menggunakan sambungan Redis dalam persekitaran PHP, anda perlu memasang sambungan berkaitan Redid terlebih dahulu.

pecl install redis
  1. Tambah konfigurasi Redis

Tambahkan parameter sambungan Redis dalam fail konfigurasi projek 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.phprreee

    Konfigurasikan Redis Maklumat sambungan
    1. Tambah maklumat sambungan Redis berikut pada fail .env dalam direktori akar Beri perhatian untuk mengubah suai parameter mengikut situasi sebenar:
    <?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');
        }
    }

    4. Gunakan rangka kerja Hyperf untuk. cipta kunci teragih


    Kunci kelas perkhidmatan

    🎜🎜Buat fail LockService.php dalam direktori app/Utils Hyperf untuk merangkum kaedah berkaitan kunci yang diedarkan: 🎜
    <?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 {
                // 未获得锁,返回重试或失败的响应
            }
        }
    }
    🎜🎜Gunakan kunci Kelas perkhidmatan 🎜🎜🎜 Di mana kunci teragih perlu digunakan, tolak kelas perkhidmatan kunci melalui suntikan kebergantungan dan gunakannya Contoh berikut menunjukkan cara menggunakan kunci teragih untuk mencapai pemprosesan permintaan idempoten: 🎜rrreee🎜 5. Ringkasan. 🎜Dengan menyepadukan Redis dan merangkum kelas perkhidmatan kunci teragih rangka kerja Hyperf, kami boleh menggunakan kunci teragih yang mudah, boleh dipercayai dan berprestasi tinggi untuk mengurus sumber kongsi dalam sistem teragih dan memastikan ketekalan dan kebolehpercayaan data. Pada masa yang sama, ia juga meningkatkan keupayaan pemprosesan serentak sistem dan meminta kecekapan pemprosesan. Kunci yang diedarkan sangat penting dalam aplikasi praktikal Saya berharap pengenalan artikel ini dapat membantu pembaca lebih memahami dan menggunakan kunci yang diedarkan. 🎜

Atas ialah kandungan terperinci Cara menggunakan rangka kerja Hyperf untuk pengurusan kunci teragih. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn