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麻省理工学院,请参阅许可证文件。
错误报告(和小补丁)可以通过问题跟踪器提交。对于大量补丁来说,优选分配存储库并提交拉动请求。