- 分布式锁概念
- 分布式锁四种雷区
- 分布式锁特性
- 实现原理
- 加锁
- 使用set扩展命令,key:锁标识,value:持有当前锁线程标识,PX:超时时间(毫秒)。
-
# 加锁命令 set key value NX PX milliseconds
-
解锁
-
只有当前锁的持有者才可以执行删除操作,通过lua脚本保证了get和del命令执行的原子性操作。
-
// 通过lua脚本,解决了 解铃还须系铃人 的问题。 // 使用redis+lua脚本(保证原子性,减少网络开销) $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脚本 $this->redis->eval($script, [$this->lockKey, $this->lockValue], 1);
-
- 绪期(进程占用时间太长,避免并发获得锁)
-
$script = <<<LUA if (redis.call('get', KEYS[1]) == ARGV[1]) then return redis.call('expire', KEYS[1], ARGV[2]) else return 0 end LUA; $this->redis->eval($script, [$this->lockKey,$this->lockValue,$this->expireTime], 1)
-
- RedLock算法
-
集群脑裂:集群脑裂指因为网络问题,导致 Redis master 节点跟 slave 节点和 sentinel 集群处于不同的网络分区,因为 sentinel 集群无法感知到 master 的存在,所以将 slave 节点提升为 master 节点,此时存在两个不同的 master 节点。Redis Cluster 集群部署方式同理。
-
- 加锁
转载于:Redlock(redis分布式锁)原理分析_狂奔的蜗牛Evan的博客-CSDN博客_redlock,百度安全验证https://baijiahao.baidu.com/s?id=1706527669583273516&wfr=spider&for=pc