reactphp redlock
v2.1.0
PHP的異步Redlock算法實現
安裝後,您可以通過實例化其託管人將Redlock納入項目中;該實體負責鎖定編排,並且需要訪問Redis Client Object實例,例如
/* Instantiate prerequisites */
$ factory = new Clue React Redis Factory ();
$ client = $ factory -> createLazyClient ( ' 127.0.0.1 ' );
/* Instantiate our lock custodian */
$ custodian = new RTCKit React Redlock Custodian ( $ client );對於需要二進制結果的用例, acquire()方法效果最好,例如:
/**
* @param string $resource Redis key name
* @param float $ttl Lock's time to live (in seconds)
* @param ?string $token Unique identifier for lock in question
* @return PromiseInterface
*/
$ custodian -> acquire ( ' MyResource ' , 60 , ' r4nd0m_token ' )
-> then ( function (? Lock $ lock ) {
if ( is_null ( $ lock )) {
// Ooops, lock could not be acquired for MyResource
} else {
// Awesome, MyResource is locked for a minute
// ...
// Be nice and release the lock when done
$ custodian -> release ( $ lock );
}
}); spin()方法是針對過程應繼續嘗試獲取鎖定的情況
/**
* @param int $attempts Maximum spin/tries
* @param float $interval Spin/try interval (in seconds)
* @param string $resource Redis key name
* @param float $ttl Lock's time to live (in seconds)
* @param ?string $token Unique identifier for lock in question
* @return PromiseInterface
*/
$ custodian -> spin ( 100 , 0.5 , ' HotResource ' , 10 , ' r4nd0m_token ' )
-> then ( function (? Lock $ lock ): void {
if ( is_null ( $ lock )) {
// Wow, after 100 tries (with a gap of 0.5 seconds) I've
// given up acquiring a lock on HotResource
} else {
// Awesome, HotResource is locked for 10 seconds
// ...
// Again, be nice and release the lock when done
$ custodian -> release ( $ lock );
}
})最後,提供的示例是一個很好的起點。
Redlock與PHP 7.2+兼容,需要線索/ReactPHP-REDIS庫。
您可以使用Composer添加庫作為項目依賴項:
composer require rtckit/react-redlock如果您在開發過程中只需要庫,例如在測試套件中使用時,則應將其添加為僅開發的依賴性:
composer require --dev rtckit/react-redlock要運行測試套件,請克隆此存儲庫,然後通過Composer安裝依賴項:
composer install然後,轉到項目root並運行:
php -d memory_limit=-1 ./vendor/bin/phpunit -c ./etc/phpunit.xml.dist為了確保高碼質量,Redlock使用Phpstan和Psalm:
php -d memory_limit=-1 ./vendor/bin/phpstan analyse -c ./etc/phpstan.neon -n -vvv --ansi --level=max src
php -d memory_limit=-1 ./vendor/bin/psalm --config=./etc/psalm.xml --show-info=true麻省理工學院,請參閱許可證文件。
錯誤報告(和小補丁)可以通過問題跟踪器提交。對於大量補丁來說,優選分配存儲庫並提交拉動請求。