laravel/hyperf 中redis的set命令实现分布式锁

Wiki · 本文由 · ITer · 发布于 1年前 · 908 阅读

很多分布式锁的做法是,这个做法如果在 setnx 之后执行 expire之前进程意外 crash 或者要重启维护了,这个锁就永远得不到释放了

public function acquire()
{
    $result = $this->redis->setnx($this->name, $this->owner);

    if ($result === 1 && $this->seconds > 0) {
        $this->redis->expire($this->name, $this->seconds);
    }

    return $result === 1;
}

可以通过以下命令实现分布式锁,因为是一条命令所以可以保证原子性

// 原生命令 set name 111 PX 10000 NX
return $this->redis->set('name','111',['NX', 'PX' => 10000]);

成为第一个本话题的爱慕者吧

评论数量:0