最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解PHP中互斥鎖庫hyperf-wise-locksmith的使用

 更新時間:2024年11月28日 10:48:38   作者:左詩右碼  
hyperf-wise-locksmith?庫作為?Hyperf?框架中的一員,提供了一個高效、簡潔的互斥鎖解決方案,下面就跟隨小編一起了解下它的具體使用吧

在分布式系統(tǒng)中,如何確保多臺機器之間不會產生競爭條件,是一個常見且重要的問題。hyperf-wise-locksmith 庫作為 Hyperf 框架中的一員,提供了一個高效、簡潔的互斥鎖解決方案。

本文將帶你了解這個庫的安裝、特性、基本與高級功能,并結合實際應用場景,展示其在項目中的應用。

hyperf-wise-locksmith 庫簡介

hyperf-wise-locksmith 是一個適配 Hyperf 框架的互斥鎖庫,它基于 pudongping/wise-locksmith 庫構建。它可以幫助我們在分布式環(huán)境下進行鎖的管理,確保同一時刻只有一個進程能夠操作某些共享資源,從而避免數(shù)據(jù)的競爭和不一致問題。

安裝

要在你的 Hyperf 項目中使用 hyperf-wise-locksmith,你需要通過 Composer 進行安裝:

composer require pudongping/hyperf-wise-locksmith -vvv

確保你的環(huán)境滿足以下要求:

  • PHP >= 8.0
  • hyperf ~3.0.0。

特性

hyperf-wise-locksmith 提供了多種鎖機制,包括文件鎖、分布式鎖、紅鎖協(xié)程級別的互斥鎖。這些鎖機制可以幫助開發(fā)者在不同的場景下保護共享資源,避免競態(tài)條件。

基本功能

文件鎖(flock)

文件鎖是一種簡單的鎖機制,它依賴于文件系統(tǒng)。以下是一個使用文件鎖的示例:

    private function flock(float $amount)
    {
        $path = BASE_PATH . '/runtime/alex.lock.cache';
        $fileHandler = fopen($path, 'a+');
        // fwrite($fileHandler, sprintf("%s - %s \r\n", 'Locked', microtime()));

        $res = $this->locker->flock($fileHandler, function () use ($amount) {
            return $this->deductBalance($amount);
        });
        return $res;
    }

分布式鎖(redisLock)

分布式鎖適用于分布式系統(tǒng),它依賴于 Redis。以下是一個使用分布式鎖的示例:

    private function redisLock(float $amount)
    {
        $res = $this->locker->redisLock('redisLock', function () use ($amount) {
            return $this->deductBalance($amount);
        }, 10);
        return $res;
    }

高級功能

紅鎖(redLock)

紅鎖是一種更安全的分布式鎖實現(xiàn),它需要多個 Redis 實例。以下是一個使用紅鎖的示例:

    private function redLock(float $amount)
    {
        $res = $this->locker->redLock('redLock', function () use ($amount) {
            return $this->deductBalance($amount);
        }, 10);
        return $res;
    }

協(xié)程級別的互斥鎖(channelLock)

協(xié)程級別的互斥鎖適用于協(xié)程環(huán)境,它提供了一種輕量級的鎖機制。以下是一個使用協(xié)程鎖的示例:

    private function channelLock(float $amount)
    {
        $res = $this->locker->channelLock('channelLock', function () use ($amount) {
            return $this->deductBalance($amount);
        });
        return $res;
    }

實際應用場景

假設我們有一個在線支付系統(tǒng),需要在多個請求中扣減用戶的余額。如果不使用互斥鎖,可能會導致超扣或扣減失敗。使用 hyperf-wise-locksmith 庫,我們可以確保每次扣減操作都是原子性的。

代碼示例

以下是一個扣減用戶余額的示例,使用了 hyperf-wise-locksmith 庫:

<?php
declare(strict_types=1);

namespace App\Services;

use Hyperf\Contract\StdoutLoggerInterface;
use Pudongping\HyperfWiseLocksmith\Locker;
use Pudongping\WiseLocksmith\Exception\WiseLocksmithException;
use Pudongping\WiseLocksmith\Support\Swoole\SwooleEngine;
use Throwable;

class AccountBalanceService
{

    /**
     * 用戶賬戶初始余額
     *
     * @var float|int
     */
    private float|int $balance = 10;

    public function __construct(
        private StdoutLoggerInterface $logger,
        private Locker                $locker
    ) {
        $this->locker->setLogger($logger);
    }

    private function deductBalance(float|int $amount)
    {
        if ($this->balance >= $amount) {
            // 模擬業(yè)務處理耗時
            usleep(500 * 1000);
            $this->balance -= $amount;
        }

        return $this->balance;
    }

    /**
     * @return float
     */
    private function getBalance(): float
    {
        return $this->balance;
    }

    public function runLock(int $i, string $type, float $amount)
    {
        try {
            $start = microtime(true);

            switch ($type) {
                case 'flock':
                    $this->flock($amount);
                    break;
                case 'redisLock':
                    $this->redisLock($amount);
                    break;
                case 'redLock':
                    $this->redLock($amount);
                    break;
                case 'channelLock':
                    $this->channelLock($amount);
                    break;
                case 'noMutex':
                default:
                    $this->deductBalance($amount);
                    break;
            }

            $balance = $this->getBalance();
            $id = SwooleEngine::id();
            $cost = microtime(true) - $start;
            $this->logger->notice('[{type} {cost}] ==> [{i}<=>{id}] ==> 當前用戶的余額為:{balance}', compact('type', 'i', 'balance', 'id', 'cost'));

            return $balance;
        } catch (WiseLocksmithException|Throwable $e) {
            return sprintf('Err Msg: %s ====> %s', $e, $e->getPrevious());
        }
    }

}

然后我們再寫一個控制器進行調用

<?php

declare(strict_types=1);

namespace App\Controller;

use Hyperf\HttpServer\Annotation\AutoController;
use App\Services\AccountBalanceService;
use Hyperf\Coroutine\Parallel;
use function \Hyperf\Support\make;

#[AutoController]
class BalanceController extends AbstractController
{

    // curl '127.0.0.1:9511/balance/consumer?type=noMutex'
    public function consumer()
    {
        $type = $this->request->input('type', 'noMutex');
        $amount = (float)$this->request->input('amount', 1);

        $parallel = new Parallel();
        $balance = make(AccountBalanceService::class);

        // 模擬 20 個并發(fā)
        for ($i = 1; $i <= 20; $i++) {
            $parallel->add(function () use ($balance, $i, $type, $amount) {
                return $balance->runLock($i, $type, $amount);
            }, $i);
        }

        $result = $parallel->wait();

        return $this->response->json($result);
    }

}

當我們訪問 /balance/consumer?type=noMutex 地址時,我們可以看到用戶的余額會被扣成負數(shù),這明顯不符合邏輯。 然而當我們訪問下面幾個地址時,我們可以看到用戶余額不會被扣成負數(shù),則說明很好的保護了競態(tài)下的共享資源的準確性。

  • /balance/consumer?type=flock :文件鎖
  • /balance/consumer?type=redisLock :分布式鎖
  • /balance/consumer?type=redLock :紅鎖
  • /balance/consumer?type=channelLock :協(xié)程級別的互斥鎖

注意

關于使用到 redisLockredLock 時:

  • 使用 redisLock 默認采用的 config/autoload/redis.php 配置文件中的第一個 key 配置 redis 實例(即 default)??砂葱鑲魅氲?4 個參數(shù) string|null $redisPoolName 進行重新指定。
  • 使用 redLock 默認采用的 config/autoload/redis.php 配置文件中的所有 key 對應的配置 redis 實例。可按需傳入第 4 個參數(shù) ?array $redisPoolNames = null 進行重新指定。

文檔

詳細文檔可見 pudongping/wise-locksmith。

結語

hyperf-wise-locksmith 庫為 Hyperf 框架的開發(fā)者提供了強大的互斥鎖功能,可以幫助我們在高并發(fā)場景下保護共享資源。

通過本文的介紹,希望你能對 hyperf-wise-locksmith 有一個全面的了解,并在你的項目中靈活運用。如果你覺得這個庫對你有幫助,希望你可以幫忙點個 Star 喲~

以上就是詳解PHP中互斥鎖庫hyperf-wise-locksmith的使用的詳細內容,更多關于PHP hyperf-wise-locksmith的資料請關注腳本之家其它相關文章!

相關文章

  • 解析PHP生成靜態(tài)html文件的三種方法

    解析PHP生成靜態(tài)html文件的三種方法

    本篇文章是對PHP生成靜態(tài)html文件的三種方法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 什么是PEAR?什么是PECL?PHP中兩個容易混淆的概念解釋

    什么是PEAR?什么是PECL?PHP中兩個容易混淆的概念解釋

    這篇文章主要介紹了什么是PEAR?什么是PECL?PHP中兩個容易混淆的概念解釋,本文用簡潔的語言解釋了 它們的不同之處,需要的朋友可以參考下
    2015-07-07
  • php文件下載處理方法分析

    php文件下載處理方法分析

    這篇文章主要介紹了php文件下載處理方法,實例分析了php針對文件下載的常用處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • php json_encode()函數(shù)返回json數(shù)據(jù)實例代碼

    php json_encode()函數(shù)返回json數(shù)據(jù)實例代碼

    php返回json數(shù)據(jù)用到json_encode()函數(shù),此函數(shù)會生成一個標準的json格式的數(shù)據(jù),實例代碼如下
    2014-10-10
  • Zend Framework中的簡單工廠模式 圖文

    Zend Framework中的簡單工廠模式 圖文

    某天又然后想到好久沒復習設計模式了。綜合一下,復習一個設計模式之后在ZF中找一下使用這模式的源碼吧,不讀所有源碼,讀讀比較”高級”的部分吧,要說模式,暫時不知道是不是所有模式ZF里面都有,但是應該有足夠的模式夠我最近看了,在說可以找找其他開源的軟件來找模式
    2012-07-07
  • php中的常用魔術方法總結

    php中的常用魔術方法總結

    以下是對php中的常用魔術方法進行了詳細的總結介紹,需要的朋友可以過來參考下
    2013-08-08
  • php 顯示指定路徑下的圖片

    php 顯示指定路徑下的圖片

    給一個路徑,得到她下面的圖片,并顯示出來的php代碼。
    2009-10-10
  • php 中英文語言轉換類

    php 中英文語言轉換類

    想做個中英文的功能試一下,只是把一些常用且有規(guī)律的詞匯比如 ‘評論’ ,時間單位(幾秒幾小時前這些)可以自由的轉化。
    2011-09-09
  • php導出CSV抽象類實例

    php導出CSV抽象類實例

    這篇文章主要介紹了php導出CSV抽象類及其用法示例,可實現(xiàn)循環(huán)導出功能,從而避免內存不足的問題,需要的朋友可以參考下
    2014-09-09
  • php URL驗證正則表達式

    php URL驗證正則表達式

    php URL驗證正則表達式,需要的朋友可以參考下。
    2011-07-07

最新評論

南宫市| 民和| 武功县| 稻城县| 平罗县| 德清县| 林周县| 富蕴县| 平乡县| 虎林市| 祁阳县| 墨江| 柏乡县| 芮城县| 茂名市| 桐梓县| 尖扎县| 突泉县| 安图县| 元江| 莫力| 石林| 扶风县| 凭祥市| 上饶县| 漯河市| 阳新县| 郸城县| 怀远县| 柳河县| 民丰县| 扶绥县| 安溪县| 嘉义市| 镇巴县| 甘孜县| 友谊县| 绥阳县| 辽阳县| 宾阳县| 容城县|