texthtml/php-lock-redis

v1.2.0 2019-05-23 15:16 UTC

This package is auto-updated.

Last update: 2024-08-24 19:26:07 UTC


README

Build Status Latest Stable Version License Total Downloads Scrutinizer Code Quality

php-lock-redis 是一个为 php-lock 扩展的库,使得在分布式系统中使用 Redis 实现资源锁定变得简单。它可以替代基于文件的锁定来锁定分布式系统上的操作。

安装

使用 Composer

composer require texthtml/php-lock-redis

使用方法

你可以创建一个表示资源锁的对象。然后你可以通过调用 $lock->acquire() 尝试获取这个锁。如果锁定失败,它将抛出一个 Exception(对于使用 Symfony Console Components 文档 构建的 CLI 工具很有用)。如果成功获取锁,程序可以继续执行。

锁定资源

use TH\RedisLock\RedisSimpleLockFactory;

$redisClient = new \Predis\Client;
$factory = new RedisSimpleLockFactory($redisClient);
$lock = $factory->create('lock identifier');

$lock->acquire();

// other processes that try to acquire a lock on 'lock identifier' will fail

// do some stuff

$lock->release();

// other processes can now acquire a lock on 'lock identifier'

自动释放

$lock->release() 会在锁被销毁时自动调用,因此你不需要在脚本结束时或超出作用域时手动释放它。

use TH\RedisLock\RedisSimpleLockFactory;

function batch() {
    $redisClient = new \Predis\Client;
    $factory = new RedisSimpleLockFactory($redisClient);
    $lock = $factory->create('lock identifier');
    $lock->acquire();

    // lot of stuff
}

batch();

// the lock will be released here even if $lock->release() is not called in batch()

限制

有效期

如果一个客户端在释放锁之前崩溃(或忘记释放它),其他客户端将无法再次获取锁。为了避免死锁,RedisSimpleLock 锁具有一个有效期,在此期间锁键将过期。但请注意,如果操作时间过长,另一个客户端也可能获取到锁。

互斥

由于 RedisSimpleLock 没有实现 RedLock 算法,它存在一个限制:在主从复制中,如果主节点在将锁键传输到从节点之前崩溃,可能会发生竞争条件。在这种情况下,第二个客户端可能会获取到相同的锁。