rtckit / react-redlock
使用Redis和ReactPHP实现异步分布式锁
2.1.0
2021-09-02 17:36 UTC
Requires
- php: >=7.2
- clue/redis-react: ^2.5
- react/event-loop: ^1.2
Requires (Dev)
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.9
README
PHP的异步Redlock算法实现
快速开始
安装完成后,您可以通过实例化其监护者将Redlock集成到项目中;该实体负责锁编排,并需要访问Redis客户端对象实例,例如:
/* 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+兼容,并需要clue/reactphp-redis库。
安装
您可以使用Composer将库作为项目依赖项添加。
composer require rtckit/react-redlock
如果您仅在开发期间需要库,例如在测试套件中使用,那么应将其添加为仅开发依赖项
composer require --dev rtckit/react-redlock
测试
要运行测试套件,请克隆此存储库,然后通过Composer安装依赖项。
composer install
然后,转到项目根目录并运行
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
许可
MIT,见LICENSE文件。
致谢
- antirez - 原始博客文章
- ReactPHP项目
- clue/reactphp-redis - 异步Redis客户端实现
贡献
可以通过问题跟踪器提交错误报告(和小补丁)。对于重大补丁,建议Fork存储库并提交Pull Request。