Redis分布式锁理论知识整理
-
命令:SET resource_name my_random_value NX PX 30000
1、设置锁的过期时间是必要的:客户端在获取锁之后,由于某种原因导致其奔溃,那么它将一直持有锁
2、获取锁和设置锁过期时间必须保证原子性:如果不是原子操作,有可能客服端在获取到锁后,由于某种原因导致奔溃,那么它也将一直持有锁
3、设置一个唯一标志是必要的:表明锁属于哪个客户端,防止锁误删(客户端A获取锁成功,并且在过期时间内没有其工作,锁将自动删除,那么客户端B可获取锁成功,当客户端A完成其工作后,就有可能将客户端B的锁删掉,这是不允许的)
4、使用Lua脚本删锁:保证原子性(获取->判断->删除) -
failover可能导致分布式锁不可用
假如Redis节点宕机,所以客服端将无法获取锁;为了满足高可用,可以为节点挂一个从节点;虽然可以实高可用,但由于replication是异步执行的,在failover过程锁有可能没有被同步
解决:基于N个完全独立的Redis节点(大多数客户端获取锁成功才视为获取锁成功) -
节点宕机后重启可能导致分布式锁不可用
客服端成功获取锁的操作没有被持久化
解决:延迟重启(节点重启时间 > 锁有效时间) -
客户端应该主动释放锁,防止客户端获取锁成功后,数据包丢失,导致客服端不知道自己已经获取锁成功
异步模型:进程可能pause任意长的时间,消息可能在网络中延迟任意长的时间,甚至丢失,系统时钟也可能以任意方式出错。
好的分布式算法:这些因素(异步模型)不应该影响它的安全性,只可能影响到它的活性;也就是说,即使在非常极端的情况下,算法顶多是不能在有限的时间内给出结果而已,而不应该给出错误的结果