首页 新闻 会员 周边 捐助

关于redis减去库存问题!!!面试常问,很大一个坑!有没有大佬

1
悬赏园豆:20 [已解决问题] 解决于 2020-03-31 15:44

常见流程是先减去库存,然后到MQ,然后判断是否超卖,然后写入数据库(唯一索引防止重复)。
redis库存10,mysql库存10,但是现在一个人发了10条秒杀,redis = 0 mysql = 10,成功一条redis = 0,mysql = 9.
那么其他人没法秒杀了,并且只卖出去一件商品。

dark_Souls的主页 dark_Souls | 初学一级 | 园豆:124
提问于:2020-03-31 14:12
< >
分享
最佳答案
1

这个叫幂等性,即同一个操作,无论重复多少次,其结果应该是一致的。
回到你这个问题,一个人发了10次秒杀,应该等同于发一次秒杀。那么你在redis应该记录一下这个用户的唯一标识,标识其是否进行过秒杀活动。
秒杀成功,同样mysql也要做记录,避免服务重启等原因造成缓存丢失,重复秒杀的情况。

收获园豆:20
。淑女范erり | 小虾三级 |园豆:961 | 2020-03-31 15:40

NP,确实是这个道理,我咋就没想到EMMMMMMM

dark_Souls | 园豆:124 (初学一级) | 2020-03-31 15:42
其他回答(2)
0

redis -10了,为啥你的mysql才-1呢......

czd890 | 园豆:14488 (专家六级) | 2020-03-31 14:46

一个用户只允许,秒杀一件商品,他重复提交了十次,只有一次成功,但是redis库存已经没了,这应该涉及到缓存一致性的东西了。

支持(0) 反对(0) dark_Souls | 园豆:124 (初学一级) | 2020-03-31 14:47
2

没用用Redis的LUA的脚本写,分开写原子性都保证不了

麦兜很乖 | 园豆:214 (菜鸟二级) | 2020-03-31 21:18

过了半年,我才想到确实是LUA才行,那个标识符不行,如果失败了,用户岂不是不能秒杀了?

支持(0) 反对(0) dark_Souls | 园豆:124 (初学一级) | 2020-09-10 17:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册