利用redis分布式锁来实现线程的安全,当执行某一动作时,将特定的key,存入redis,每次执行该动作时,都到redis进行存值校验,当且只有存入成功时才执行动作。
redis 分布式锁设计模式:
set key value NX EX max-lock-time
解析:
存入一个键值,当且只有该键值不存在的情况下返回成功,如果该键值已经存在返回nil,该设计就是为了防止A线程动作操作期间,其他线程执行该动作,EX,设置锁的过期时间,防止调用线程因其他原因死掉或者挂起而无法正常的释放锁,而造成其余线程的阻塞,这里有EX(秒)、PX(毫秒)两种时间单位可选。
正常的释放锁机制:
也就是当一个线程调用完毕,释放锁,而非因为线程死掉或者挂起而导致的达到最大过期时间,redis服务器的对键的删除。正常释放锁,又要考虑,当A线程线程因为原因未能及时释放锁,而是因为超出了最大的所时间,被redis删除了锁,因为锁被redis释放,B线程又在redis中设置了锁,此时A线程执行了DEL,就会把B线程的锁释放。
因此在释放锁的机制也要考虑。