mmdtl/autolock

PHP 的 Redis 分布式锁

0.1.0 2017-03-28 11:45 UTC

This package is not auto-updated.

Last update: 2024-09-29 02:52:01 UTC


README

AutoLock - PHP 中的 Redis 分布式锁

此库实现了由 @antirez 提出的 RedLock 算法。

此库实现了基于 Redis 的分布式锁管理器算法,该算法在这篇博客文章中描述。

创建锁管理器

$pool = new \AutoLock\Pool(array(
    '192.168.1.1:6379',
    '192.168.1.2:6379',
    '192.168.1.3:6379',
),new \AutoLock\Drivers\PHPRedis());

$manager = new \AutoLock\Manager($pool);

获取锁

$lock = $manager->lock('distributed_lock',1000);;

资源名称是您尝试加锁的资源的唯一标识符,1000 是锁的有效时间(毫秒数)。

如果未获取到锁,则返回值是 false(您可能需要再次尝试),否则返回一个表示锁的对象。您应使用 isExpired 方法来检测锁是否已过期或将在某个时间点过期。

$status = $lock->isExpired();
//$status will be true if the lock is expired or it will be false
$status = $lock->isExpired(3600 * 1000);
//$status will be true if the lock will be expired after 3600 seconds or it will be false
  • validity,一个表示锁有效时间的整数。
  • resource,用户指定的已锁定资源名称。
  • token,一个用于安全回收锁的随机令牌值。

释放锁

    $lock->unlock($lock)

您可以为获取锁设置重试次数(默认为 3)和重试延迟(默认为 200 毫秒)。

重试延迟实际上是在 $retryDelay / 2 毫秒和指定的 $retryDelay 值之间随机选择的。