前言
在上一篇中,我们利用mysql数据库的行锁特性,实现了一个简单的分布式锁,但是从经验即可判断,数据库的分布式锁实现,在高并发场景下性能方面应该会大打折扣,当然,如果能够提前预判系统的并发并不算太大,这种实现也是没问题的,下面介绍下分布式锁的第二种实现,基于redis实现分布式锁
redis分布式锁原理
redis实现分布式锁的原理其实非常简单,即通过一个 Setnx的命令进行实现,即:
SET resource_key_name resource_key_value NX PX 10000
简单解释下:
- resource_key_name :资源名称,可以根据不同的业务区分为不同的锁
- resource_key_value :随机值,每个线程的值不同,用于释放锁的时候进行校验
- NX :key不存在的时候可以设置成功,如果已经有线程进来并设置成功了,下一个线程过来时就设置失败【由于redis的操作是单线程的,对同一个key的操作必然会进行排队操作】
- PX :自动失效时间,当出现异常情况时,为了确保不会死锁,可以对锁设置超时时间
总结来说,就是利用NX的原子性,在多个线程并发执行时,确保只有一个线程可以设置成功
- 设置锁成功,可以继续执行后续的业务
- 如果出现异常,由于设定了有效期,过了锁的有效期,