lysice / hyperf-redis-lock
v2.1.1
2022-12-07 04:48 UTC
Requires
- php: >=7.3
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.14
- mockery/mockery: ^1.0
- phpstan/phpstan: ^0.12
- phpunit/phpunit: >=7.0
- swoole/ide-helper: dev-master
- swow/swow: dev-develop
- symfony/var-dumper: ^5.1
This package is auto-updated.
Last update: 2024-09-10 13:54:13 UTC
README
英文 | 中文
hyperf 2.* 的一个简单的基于 Redis 的分布式锁实现。本扩展包含分布式锁功能,包括阻塞锁和解锁。
原理
Redis 中的命令是原子的,所以我们使用 set
来确保您的应用程序顺序执行。Redis 版本 2.8 之前的版本不支持在 set
命令中使用 ex
选项。所以我们使用 setnx+expire
代替。>> 版本 1.* Redis 版本 2.8 之后的版本支持在 set
命令中使用 ex
选项。所以我们使用 set nx ex
>> 版本 2.*
所以版本 2.* 支持版本 2.8 之后的 Redis 版本。版本 1.* 支持所有 Redis 版本。
Redis 版本
redis-server --version
安装
运行 composer require lysice/hyperf-redis-lock
用法
初始化 redis
对象
/**
* @var RedisProxy
*/
protected $redis;
public function __construct(RedisFactory $redisFactory)
{
$this->redis = $redisFactory->get('default');
}
- 非阻塞锁尝试获取锁,然后直接返回结果。如果获取到锁,则执行闭包并返回闭包的结果,否则返回 false;
public function lock(ResponseInterface $response)
{
$lock = new RedisLock($this->redis, 'lock', 20);
$res = $lock->get(function () {
sleep(10);
return [123];
});
return $response->json($res);
}
- 阻塞锁首先尝试获取锁。1.如果失败,则每 250 毫秒尝试获取锁,直到超时(我们等待的时间大于您在应用程序中设置的过期时间)2.如果成功,则执行闭包并返回闭包的结果。
提示:如果在应用程序过程中发生超时,您需要捕获异常LockTimeoutException
来处理这种情况。例如
/**
* @return \Psr\Http\Message\ResponseInterface
*/
public function lockA(ResponseInterface $response)
{
try {
$lock = new RedisLock($this->redis, 'lock', 4);
$res = $lock->block(4, function () {
return [456];
});
return $response->json(['res' => $res]);
// catch the exception
} catch (LockTimeoutException $exception) {
var_dump('lockA lock check timeout');
return $response->json(['res' => false, 'message' => 'timeout']);
}
}
最后
贡献
如果您想贡献,请随意创建一个分叉并提交一个拉取请求。
错误报告
如果您发现有问题,请在上 GitHub 上提交一个问题。