php-redis灵活锁

实现功能

可以根据方法名(__FUNCTION__、__METHOD__),或者方法名+用户id等多种自定义键值进行加锁。

解锁方式有三种:

1.设置锁时间过期自动解锁

2.控制器销毁后自动解锁

3.手动解锁

 原理

1.加锁

     /**
     *加锁代码
     * @param $key  自定义键值
     * @param int $expireTime 锁过期时间
     * @return bool|mixed  成功返回锁唯一id,失败返回false或抛出错误
     * @throws \Exception 
     */
    public static function addLock($key, $expireTime = self::LOCK_DEFAULT_EXPIRE_SECOND)
    {
        //传入参数判断
        if (empty($key) || $expireTime <= 0) {
            return false;
        }
        //创建redis实例
        $redisClient = self::redis();

        //获取唯一锁id
        $uniqueLockId =  self::getUniqueLockId();

        //生成最终key
        $finalKey = sprintf(self::LOCK_KEY, $key);

        //使用setnx 进行锁判断
        $LockRet = $redisClient->set($finalKey, $uniqueLockId, ['nx', 'ex'=>$expireTime]);

        if($LockRet == false) {
            //加锁失败
            throw new \Exception('redis lock failed');
        }
        //返回唯一锁id(解锁的时候需要用到)
        return $uniqueLockId;
    }

 2.解锁

    /**
     * 解锁操作
     * @param $key  传入锁key
     * @param $uniqueLockId  传入锁唯一id 
     * @return bool  返回是否成功
     */
    public static function releaseLock($key, $uniqueLockId)
    {
        //参数验证
        if (empty($key) || empty($uniqueLockId)) {
            return false;
        }
        //获取redis实例
        $redisClient = self::redis();
        //获取最终key
        $finalKey = sprintf(self::LOCK_KEY, $key);
        //监听期间锁是否被改变
        $redisClient->watch($finalKey);
        if ($uniqueLockId == $redisClient->get($finalKey)) {
            $redisClient->multi()->del($finalKey)->exec();
            return true;
        }
        $redisClient->unwatch();
        return false;
    }

完整代码链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿桂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值