已经拿到了 lockvalue ,有了 UUID,但是过期了现在!其他人拿到所锁设置了新值,于是 if 后将别人的锁删了!!也就是删除锁不是原子操作。
官方叫做RedLock算法,是Redis官方支持的分布式锁算法.
这个分布式锁有3个重要的考量点
创建一个key
SET my:lock 随机值 NX PX 30000
释放锁就是删除key,但是一般可以用lua脚本删除,判断value一样才删除:
关于redis如何执行lua脚本,自行百度
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
为啥用随机值呢? 因为如果某客户端获取锁,但阻塞了很长时间才执行完,此时可能已经超时释放锁了,可能别的客户端已经获取到了锁,要是此时你直接删除key会有问题,所以得用随机值加上面的lua脚本来释放锁.
但是这样是肯定不行的
假设有一个redis cluster,有5个redis master实例. 执行如下步骤获取锁: