redis中分布式锁的应用
我们之前讲了秒杀模块的实现,使用了sychronized互斥锁,但是在集群模式下因为不同服务器有不同jvm,所以synchronized互斥锁失效了。
这时就要找到一个两台服务器都能识别的锁,即redis中的setNX充当互斥锁,来控制秒杀的一人一单
在redis缓存击穿中,使用逻辑过期就用过互斥锁,这里原理一摸一样,只不过这里存储的value为线程ID
setNX互斥锁的使用:
场景1:(会导致一个用户创建多个订单)
场景2:
注*线程1和线程2的userID相同,所以创建的redis锁key值相同,但是value不相同,释放锁时如果不进行验证value值,很有可能会出现场景1的情况。
所以当线程检查锁不为自己的锁时,应该回滚,不创建订单,这样才可以保证一人一单