redis实现分布式锁
什么时候要用到分布式锁?
集群情况下的定时任务、抢单、幂等性场景
抢券逻辑
当库存为1时,多线程的情况可能出现超卖。当两个线程都查询到数据库库存还有1时,都去扣减库存,可能导致库存出现复数。
如何解决呢?
加锁。单体项目的情况下:给某一个线程加锁(SETNX锁),其他抢券线程阻塞,直到锁释放才能修改库存。
但是往往项目是集群部署。同一份代码部署在多态服务器上 。SETNX锁是本地锁,这个锁是属于JVM的,每一个服务都有各自的JVM,只能解决同一个同一个JVM下线程的互斥,不能解决多个JVM下线程的互斥。因此集群模式下,不能使用本地锁。