ginnerpeace / redlock-php
PHP 的 Redis 分布式锁
v1.0.0
2020-01-13 05:10 UTC
Requires
- php: ^7.1.3
Requires (Dev)
- phpunit/phpunit: ^7.5
Suggests
- ext-redis: Required to use the redis command `eval` (*).
- predis/predis: Required to use the redis command `eval` (~1.0).
This package is auto-updated.
Last update: 2024-09-15 11:36:03 UTC
README
基于 Redlock-php 由 Ronny López 开发
基于 Redlock-rb 由 Salvatore Sanfilippo 开发
此库实现了基于 Redis 的分布式锁管理器算法,该算法在这篇博客文章中描述。
安装
composer require ginnerpeace/redlock-php
示例
创建锁管理器
use Ginnerpeace\RedLock\RedLock; // You can use any redis component to build the instance, // Redis instance just need to implement the method: eval $redLock = new RedLock([ 'servers' => [ [ // For ext-redis function ($host, $port, $timeout) { $redis = new \Redis(); $redis->connect($host, $port, $timeout); return $redis; }, ['127.0.0.1', 6379, 0.01] ], [ // For Predis function ($dsn) { return new Predis\Client($dsn); }, ['tcp://10.0.0.1:6379'] ], [ // For Laravel function ($name) { return RedisFacade::connection($name)->client(); }, ['redis'] ], ], ]);
获取锁
$lock = $redLock->lock('my_resource_name', 1000); // Or use dynamic retry param. $retryTime = 10; $lock = $redLock->lock('my_resource_name', 1000, $retryTime);
其中资源名称是尝试加锁的资源的唯一标识符,1000是锁的有效时间(毫秒)。
如果未获取到锁,则返回值为 []
(可以再次尝试),否则返回表示锁的数组,包含三个键
[ 'validity' => 9897.3020019531 'resource' => 'my_resource_name', 'token' => '22f8fd8d0f176ee2e1b7e676ae1f6c8b', ];
- validity,一个表示锁有效时间的整数。
- resource,用户指定的已加锁资源的名称。
- token,一个随机令牌值,用于安全地回收锁。
释放锁
$redLock->unlock($lock);
可以设置获取锁时的重试次数(默认为3次)和重试延迟(默认200毫秒)。
重试延迟实际上是在 $retryDelay / 2
毫秒和指定的 $retryDelay
值之间随机选择的。
免责声明:正如原始的antirez版本所述,此代码实现了一个目前是提案的算法,它尚未经过正式分析。在使用生产环境之前,请确保您理解它的工作原理。