ginnerpeace/redlock-php

PHP 的 Redis 分布式锁

v1.0.0 2020-01-13 05:10 UTC

This package is auto-updated.

Last update: 2024-09-15 11:36:03 UTC


README

Total Downloads Latest Stable Version Latest Unstable Version License

基于 Redlock-phpRonny López 开发

基于 Redlock-rbSalvatore 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版本所述,此代码实现了一个目前是提案的算法,它尚未经过正式分析。在使用生产环境之前,请确保您理解它的工作原理。