redis 做分布式锁
ok 我们从最基础的一步步来
加锁:
1.setNx没有expire,拿锁线程挂掉后,死锁
2.setNx然后exipre分两步做,setNx后redis宕机,或者线程挂掉,死锁
3.SETNX resource_name my_random_value PX 30000 加锁和过期原子操作 ok
解锁:
1.直接delete,可能因为业务超时删掉其他线程获得的锁
2.先get,对比唯一id后再delete,分2步做不是原子操作,不能保证delete的时候唯一id还是get是的那个
3.lua或者事务 原子操作get和delete,ok
超时:
1.业务超时,导致之前线程持有的锁过期,其他线程重新获得锁进入临界区,调大锁的超时时间,但是又会有线程挂掉,锁过期释放时间较长的问题
主宕机锁没有同步到从,从变主后导致多个线程获得锁
1.有个redLock的思想,把加锁成功的条件变成多master集群中超过半数的机器加锁成功,才算获得锁。简直了