Redis之分布式锁,PHP实现redis分布式锁

549次阅读
没有评论

共计 675 个字符,预计需要花费 2 分钟才能阅读完成。

背景

分布式锁

在分布式环境下,各个线程通过对公共资源的抢占,能够使一个代码块在同一时间只能被一个机器的一个线程执行,这个机制就是分布式锁

作用

分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性

注意点

  • 互斥锁,任意时刻,同一个标识,只有一个客户端获得锁。
  • 不会死锁。客户端没有主动解锁,不会影响到后续其他客户端获得锁。
  • 同一个客户端,自己的锁自己加,自己解。

实现

加锁

public function lock($redis){
    // 生成随机值
    $scene = md5(uniqid());
    return $redis->set($scene, $this->lockValue , ['NX', 'EX' => $this->expire]);
}
  • NX — Only set the key if it does not already exist.
  • EX — Only set the key if it already exists.
  • redis官网中set命令的介绍 https://redis.io/commands/set/

解锁


public function unLock($redis)
{
    $script = <<<LUA
        local key=KEYS[1]
        local value=ARGV[1]
        if(redis.call('get', key) == value)
        then
            return redis.call('del', key)
        end
    LUA;
    
    // lua脚本的执行是原子性!!
    $redis->eval($script, [$this->scene, $this->lockValue], 1);
}
正文完
 
BlackBeans
版权声明:本站原创文章,由 BlackBeans 2023-10-12发表,共计675字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)