weijiajia/hyperf-redis-lock

v2.2.2 2024-03-30 04:43 UTC

This package is auto-updated.

Last update: 2024-09-30 05:38: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.*支持Redis 2.8之后的版本。版本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']);
        }
    }

最后

贡献

如果您想贡献,可以自由地创建一个分支并提交一个pull request。

错误报告

如果您注意到有任何问题,请在GitHub上提出一个issue。