pizsd / hyperf-redis-lock
hyperf3-redis-lock
v1.1.2
2024-01-25 07:57 UTC
Requires
- php: >=8.0
Requires (Dev)
- mockery/mockery: ^1.6
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^9.6.16
- swoole/ide-helper: ^5.1.1
- symfony/var-dumper: ~6.0.1
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 pizsd/hyperf-redis-lock
用法
初始化 redis 对象
#[Inject]
protected Redis $redis;
public function __construct(RedisFactory $redisFactory)
{
$this->redis = $redisFactory->get('default');
}
- 非阻塞锁尝试获取锁然后直接返回结果。如果获取到锁,则执行 Closure 并返回 Closure 的结果。否则返回 false;
public function lock(ResponseInterface $response)
{
$lock = new RedisLock();
$res = $lock->get(lock, 20 *100, function () {
sleep(10);
return [123];
});
return $response->json($res);
}
- 阻塞锁首先尝试获取锁。1.如果失败,则每 250 毫秒尝试获取锁直到超时(我们等待的时间大于您在应用程序中设置的过期时间)2.如果成功,则执行 Closure 并返回 Closure 的结果。
提示:如果在应用程序的过程中发生超时,您需要捕获异常LockTimeoutException来处理这种情况。例如
/**
* @return \Psr\Http\Message\ResponseInterface
*/
public function lockA(ResponseInterface $response)
{
try {
$lock = new RedisLock();
$res = $lock->block('lock', 44, 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']);
}
}
最后
贡献
如果您想做出贡献,请随时创建一个分支并提交一个 pull request。
错误报告
如果您发现有问题,请在 GitHub 上提出一个问题。