共计 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); }
正文完