php在swoole中redis加锁续期

<?php

use Swoole\Timer;

function lockerRun(Closure $closure, string $lock_key, string $lock_val, int $expire = 30)
    {
        $result = new Result();
        $redis = new \Redis();
        $lock = $redis->set($lock_key, $lock_val, ['nx', 'ex' => $expire]);
        if ($lock) {
            $result->setLock(true);
            // 计算定时器执行时间
            $timer = intdiv($expire, 3) ?: 1;
            $ms = $timer * 1000;
            $timer_id = Timer::tick($ms, function () use ($redis, $lock_key, $lock_val, $expire) {
                $script = "
                    local lock_key = KEYS[1]
                    local ttl = redis.call('TTL', lock_key)
                    if ttl > 0 then
                        local lock_val = redis.call('GET', lock_key)
                        if lock_val == ARGV[1] and ttl <= tonumber(ARGV[2]) then
                            redis.call('EXPIRE', lock_key, tonumber(ARGV[3]))
                            return 1
                        else
                            return 0
                        end
                    else
                        return 0
                    end";
                $redis->eval($script, [$lock_key, $lock_val, $expire - intdiv($expire, 3), $expire], 1);
            });
            try {
                // 执行业务逻辑
                $result->setResult($closure());
                return $result;
            } catch (\Throwable $e) {
                throw $e;
            } finally {
                $timer_id && Timer::clear($timer_id);
                // 锁删除
                $script = "
                    local lock_key = KEYS[1]
                    local lock_val = redis.call('GET', lock_key)
                    if lock_val == ARGV[1] then
                        redis.call('DEL', lock_key)
                        return 1
                    else
                        return 0
                    end";
                $redis->eval($script, [$lock_key, $lock_val], 1);
            }
        }
        return $result;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值