分布式锁的使用场景:
比如公司为了实现服务一直可用,会部署多个实例,这样就可以一台一台机器的这样部署,其中一台部署着,另外一台还在运行,那么服务就是可用的,不会说一直处于服务不可用的状态。当处于这样场景的时候,如果你服务中有个定时任务的话,那么到点的时候,会触发多个实例的定时任务,也就是同一个时刻会执行多次定时任务里面的逻辑。如果任务的逻辑是不允许重复执行,那么这个时候就要加分布式锁,就是其中一台机器拿到处理的锁后,其他机器拿不到,就不进入逻辑处理的部分。
在redis中,实现分布锁的指令为:
SETNX
是『SET if Not eXists』(如果不存在,则 SET)的简写,不存在就set,同时返回true,存在的话就直接返回false。那么这样就可以实现只用一台机器拿到锁的逻辑。
主机x 执行 setnx 比如: setnx lock "true",返回true,进入定时任务的处理逻辑
主机y就无法设置成功,直接返回false, 那么不进入处理逻辑
处理逻辑
主机x执行del操作,完成处理逻辑
很明显这里可以会出现死锁的问题,就是当处理逻辑出现异常(同时没有做try...catch处理的时候),或者当处理逻辑在处理的时候,因为新上线的代码要部署时,刚好部署到定时任务的代码的服务,那么就会出现del操作不成功的情况。
主机x 执行 setnx 比如: