关注
1.判断库存大于 0 可不是乐观锁。实现超卖的原理:判断库存大于 0 和加锁。一条 SQL 已经能完成这个功能,避免超卖了。任何一条「写 SQL」MySQL 都会加锁的,所以不存在纯粹的乐观锁。
用 Redis 来扣减库存,主要是从性能上考虑。但是用了 Redis 就不能假设数据一定不会丢,因为它不能保证像 MySQL 一样的 ACID。虽然通过 lua 脚本保证了执行的串行化,但假设宕机了,lua 脚本没执行完或者数据丢了,很可能会有超卖问题。
要分清楚 lua 脚本的原子性和 MySQL 原子性要求是不同的。lua 的原子性保证多条命令连续地串行化执行,但是当执行失败的时候,不会回滚。MySQL 的原子性可以保证全部执行成功和全部执行失败
2.订单超时这块。其实从面试官的问题来看,他对监听 Redis key 过期这种实现是不满意的。因为也引导你 Redis 过期超时的底层原理。主要通过「惰性删除+定期删除」实现的。定期删除是通过采样的方式找到过期 key,而订单又这么多,很多订单没法及时地超时。还要考虑 Redis 被打挂的问题,虽然有 AOF + RDB,但是数据依然会丢一部分的,因为 Redis 的「持久性」没有像 MySQL 一样这么高的要求。
时间不准+数据会丢。使用 Redis 不是合适的选择。所以考虑其他过期删除方案,比如 MQ 实现订单超时(面试官可能认为这个更加合理,后面也问到你这个)
3.异步处理订单,还是得看看具体的业务场景。这项目好像是关于飞机买票的?用户肯定希望点击买票后,立即弹出一个订单。如果异步去创建,那无法立即返回,该用什么方式通知用户创建订单了呢?发短信?用户还得回过头打开 app 来支付。而且创建订单本身并不耗时,直接同步返回就好了,然后让用户付钱。
可以采用同步创建订单,异步扣减库存。因为扣减库存可能需要花点时间,这部分就可以做异步。扣减成功,发个短信通知;扣减失败,发短信+退款。
查看原帖
8 2
相关推荐
06-04 15:09
重庆邮电大学移通学院 电气工程师 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你以为的实习VS真实的实习 #
165090次浏览 918人参与
# 妈妈治愈了你哪些脆皮时刻 #
51928次浏览 414人参与
# 我的实习日记 #
4203064次浏览 33434人参与
# 第一次找实习,我建议__ #
92481次浏览 940人参与
# 文远知行求职进展汇总 #
7370次浏览 43人参与
# OC/开奖 #
459613次浏览 2338人参与
# 机械笔面试考察这些知识点 #
23953次浏览 172人参与
# 从mentor身上学到了__ #
69432次浏览 957人参与
# 你觉得mentor喜欢什么样的实习生 #
65846次浏览 1099人参与
# 实习的内耗时刻 #
247454次浏览 1677人参与
# 面试线索爆料 #
138955次浏览 718人参与
# 硬件/芯片校招攻略 #
22418次浏览 309人参与
# 当你面对裁员会如何? #
423205次浏览 3098人参与
# 工作两年想退休了 #
287550次浏览 2093人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
23897次浏览 154人参与
# 薪资一样,你会选择去大厂还是小公司 #
38597次浏览 141人参与
# 数字马力求职进展汇总 #
364365次浏览 2433人参与
# 参加过提前批的机械人,你们还参加秋招么 #
124901次浏览 1700人参与
# 研究所笔面经互助 #
132453次浏览 588人参与
# 牛客AI文生图 #
31480次浏览 318人参与