定制 msmm/hyperf-redis-lock 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

msmm/hyperf-redis-lock

最新稳定版本:v1.0.0

Composer 安装命令:

composer require msmm/hyperf-redis-lock

包简介

一个简单的Redis分布式锁的实现 基于Hyperf框架。本扩展实现了基本的分布式锁,支持阻塞式分布式锁和非阻塞式分布式锁。

关键字:

README 文档

README

一个简单的Redis分布式锁的实现 基于Hyperf框架。本扩展实现了基本的分布式锁,支持阻塞式分布式锁和非阻塞式分布式锁。

fork 自 Lysice/hyperf-redis-lock, 在其基础上支持 Hyperf ^3.1

原理

Redis的命令为原子性 使用Redisset即可保证业务的串行执行。 2.8之前版本的Redis不支持setex选项 因此只能使用 setnx+expire的方式。 对应扩展1.0版本. 2.8之后版本的Redis可以直接使用 setnx+ex选项。对应扩展2.*版本

因此 2.*版本只支持2.8版本以后的Redis 1.*版本支持所有版本的Redis.

确认你的Redis版本 如果你的Redis低于 2.8版本 则set 命令不支持 ex选项 因此你需要安装1.0版本。

redis-server --version

安装

注意:请根据你的Redis版本

composer require msmm/hyperf-redis-lock

使用

首先需要在程序内初始化你需要的 redis

/**
 * @var RedisLock
 */
protected $redis;

public function __construct(RedisFactory $redisFactory)
{
    $this->redis = $redisFactory->get('default');
}
  • 非阻塞式锁(互斥锁排它锁) 该方法在尝试获取锁之后直接返回结果。若获取到锁则执行闭包后返回结果。否则返回false
public function lock(ResponseInterface $response)
{
    // 初始化RedisLock 参数:redis实例 锁名称 超时时间
    $lock = new RedisLock($this->redis, 'lock', 20);
    // 非阻塞式获取锁
    $res = $lock->get(function () {
        sleep(10);
        return [123];
    });
    return $response->json($res);
}
  • 阻塞式锁(自旋锁) 该方法首先尝试获取锁,若获取失败 则每隔250毫秒获取一次 直到超时(等待时间超出本程序内锁的过期时间 则判定为超时)。如果锁获取成功 则执行闭包函数返回结果。 注意 若超时 则程序会抛出LockTimeoutException超时异常。应用程序内需要自己捕获该异常以便处理超时情况的返回结果。 例子:
/**
 * @return \Psr\Http\Message\ResponseInterface
 */
public function lockA(ResponseInterface $response)
{
    try {
        // 初始化RedisLock 参数:redis实例 锁名称 超时时间
        $lock = new RedisLock($this->redis, 'lock', 4);
        // 阻塞式
        $res = $lock->block(4, function () {
            return [456];
        });
        return $response->json(['res' => $res]);
    // 捕获超时异常 超时处理
    } catch (LockTimeoutException $exception) {
        var_dump('lockA lock check timeout');
        return $response->json(['res' => false, 'message' => '超时']);
    }
}

统计信息

  • 总下载量: 359
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2024-11-06