pizsd/hyperf-redis-lock

hyperf3-redis-lock

v1.1.2 2024-01-25 07:57 UTC

This package is auto-updated.

Last update: 2024-09-25 09:24:56 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 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 上提出一个问题。