[扩展] Hyperf-redis-lock 基于hyperf的分布式锁的实现

hyperf-redis-lock

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

原理

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.x版本。

您可以执行下面命令查看redis的版本。
redis-server --version

安装

注意:请根据你的Redis版本
执行 composer require lysice/hyperf-redis-lock

Redis版本 set ex支持 引入版本
<2.8 不支持 1.*
>=2.8 支持 2.* 1.*均可

使用

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

/**
 * @var RedisLock 
 */ 
 protected $redis;
 public function __construct(RedisFactory $redisFactory) {
     $this->redis = $redisFactory->get('default'); 
 }
  • 非阻塞式锁 该方法在尝试获取锁之后直接返回结果。

    • 若获取到锁则执行闭包后返回结果。
    • 获取锁失败时 默认返回false。您也可以指定可选参数 $finally 该参数为一个闭包 当获取锁失败时 若指定该闭包 则直接返回该闭包的结果。
      public function testNonBlocking(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 testBlocking(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' => '超时']);
   }
 }

最后

代码贡献

如果存在任何好的想法请提交pull request

代码问题

如果存在任何问题请提交issue.

本作品采用《CC 协议》,转载必须注明作者和本文链接
风起于青萍之末 浪成于微澜之间
南城以南
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1
游离不2

我也整了一个 github.com/friendsofhyperf/lock ,欢迎交流,顺便 start 一下

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!