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
Untuk menggunakan sambungan Redis dalam persekitaran PHP, anda perlu memasang sambungan berkaitan Redid terlebih dahulu.
pecl install 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), ], ], ];
在根目录下的.env
文件中添加以下Redis连接信息,注意根据实际情况修改参数:
REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_DB=0
四、使用Hyperf框架进行分布式锁
在Hyperf的app/Utils
目录下创建LockService.php
rreee
.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
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 { // 未获得锁,返回重试或失败的响应 } } }
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!