texthtml / php-lock-redis
redis锁
v1.2.0
2019-05-23 15:16 UTC
Requires
- ext-pcntl: *
- predis/predis: ~1.0
- psr/log: ~1.0
- texthtml/php-lock: ~2.1
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is auto-updated.
Last update: 2024-08-24 19:26:07 UTC
README
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 算法,它存在一个限制:在主从复制中,如果主节点在将锁键传输到从节点之前崩溃,可能会发生竞争条件。在这种情况下,第二个客户端可能会获取到相同的锁。