多线程扣库存的情况下如何保证线程安全?
可以使用基于redis实现的分布式锁
如何实现?
首先来介绍redis中的几个命令
SETNX key value
当且仅当key不存在时,set一个key为value的字符串,返回1;若key存在,则什么都不做,返回0
expire key timeout
为key设置一个超时时间,超过这个时间锁会自动释放,避免死锁。
delete key
删除key,释放锁
实现流程:
- 获取锁的时候,使用setnx命令生成一个key充当锁的角色,key的value值是一个随机值
- 给key设置一个超时时间,超过这个时间没有获取锁就放弃防止死锁的产生
- 释放锁的时候根据value的值判断是不是该锁,若是该锁则释放
通过这种手段可以在多线程扣库存的时候让线程按照顺序依次扣库存,线程只有获取了锁才能执行扣库存操作
补充
在项目中下订单减库存的时候如何解决重复消费问题?
在订单表中也包含了下订单人的信息即用户的userId,因为userId被创建了唯一索引只有一个,订单表中如果有相同的userId则删除该订单