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

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

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

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

本文將帶你了解這個(gè)庫的安裝、特性、基本與高級(jí)功能,并結(jié)合實(shí)際應(yīng)用場景,展示其在項(xiàng)目中的應(yīng)用。

hyperf-wise-locksmith 庫簡介

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

安裝

要在你的 Hyperf 項(xiàng)目中使用 hyperf-wise-locksmith,你需要通過 Composer 進(jìn)行安裝:

composer require pudongping/hyperf-wise-locksmith -vvv

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

  • PHP >= 8.0
  • hyperf ~3.0.0。

特性

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

基本功能

文件鎖(flock)

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

    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。以下是一個(gè)使用分布式鎖的示例:

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

高級(jí)功能

紅鎖(redLock)

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

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

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

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

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

實(shí)際應(yīng)用場景

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

代碼示例

以下是一個(gè)扣減用戶余額的示例,使用了 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è)務(wù)處理耗時(shí)
            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}] ==> 當(dāng)前用戶的余額為:{balance}', compact('type', 'i', 'balance', 'id', 'cost'));

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

}

然后我們再寫一個(gè)控制器進(jìn)行調(diào)用

<?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 個(gè)并發(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);
    }

}

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

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

注意

關(guān)于使用到 redisLockredLock 時(shí):

  • 使用 redisLock 默認(rèn)采用的 config/autoload/redis.php 配置文件中的第一個(gè) key 配置 redis 實(shí)例(即 default)??砂葱鑲魅氲?4 個(gè)參數(shù) string|null $redisPoolName 進(jìn)行重新指定。
  • 使用 redLock 默認(rèn)采用的 config/autoload/redis.php 配置文件中的所有 key 對(duì)應(yīng)的配置 redis 實(shí)例??砂葱鑲魅氲?4 個(gè)參數(shù) ?array $redisPoolNames = null 進(jìn)行重新指定。

文檔

詳細(xì)文檔可見 pudongping/wise-locksmith。

結(jié)語

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

通過本文的介紹,希望你能對(duì) hyperf-wise-locksmith 有一個(gè)全面的了解,并在你的項(xiàng)目中靈活運(yùn)用。如果你覺得這個(gè)庫對(duì)你有幫助,希望你可以幫忙點(diǎn)個(gè) Star 喲~

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

相關(guān)文章

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

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

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

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

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

    php文件下載處理方法分析

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

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

    php返回json數(shù)據(jù)用到j(luò)son_encode()函數(shù),此函數(shù)會(huì)生成一個(gè)標(biāo)準(zhǔn)的json格式的數(shù)據(jù),實(shí)例代碼如下
    2014-10-10
  • Zend Framework中的簡單工廠模式 圖文

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

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

    php中的常用魔術(shù)方法總結(jié)

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

    php 顯示指定路徑下的圖片

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

    php 中英文語言轉(zhuǎn)換類

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

    php導(dǎo)出CSV抽象類實(shí)例

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

    php URL驗(yàn)證正則表達(dá)式

    php URL驗(yàn)證正則表達(dá)式,需要的朋友可以參考下。
    2011-07-07

最新評(píng)論

西城区| 霍林郭勒市| 龙江县| 关岭| 保康县| 平舆县| 武义县| 都江堰市| 中西区| 镇安县| 辛集市| 伊金霍洛旗| 马山县| 防城港市| 台北县| 吉木乃县| 玛沁县| 江安县| 宁陕县| 广西| 历史| 维西| 枝江市| 延津县| 怀仁县| 蒲城县| 宝丰县| 上高县| 五原县| 宜阳县| 金昌市| 德州市| 图们市| 馆陶县| 苍山县| 论坛| 洞头县| 芜湖市| 蕉岭县| 永定县| 五指山市|