- 分布式锁概念
- 分布式锁四种雷区
- 分布式锁特性
- 实现原理
- 加锁
- 使用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