关注
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
牛客热帖
更多
正在热议
更多
# 实习的你做了哪些离谱的工作 #
3366次浏览 55人参与
# 工作压力大,你会干什么? #
3019次浏览 84人参与
# MiniMax求职进展汇总 #
1376次浏览 25人参与
# 参加哪些竞赛对找工作有帮助? #
3269次浏览 68人参与
# 邪修省钱套路 #
2359次浏览 91人参与
# 我的付费上班经历 #
5326次浏览 100人参与
# 找实习记录 #
7217次浏览 144人参与
# AI让你的思考变深了还是变浅了? #
999次浏览 36人参与
# 如果不上班,你会去做什么 #
2216次浏览 84人参与
# 为了入行xx岗,我学了__ #
1836次浏览 33人参与
# 简历第一个项目做什么 #
1886次浏览 43人参与
# 你找工作的时候用AI吗? #
167430次浏览 868人参与
# 如何排解工作中的焦虑 #
257645次浏览 2378人参与
# 毕业论文进行时 #
24816次浏览 146人参与
# 大厂面试初体验 #
86591次浏览 398人参与
# 机械人的薪资开到多少,才适合去? #
159440次浏览 559人参与
# 你们的毕业论文什么进度了 #
1235994次浏览 9924人参与
# 你觉得面试是靠实力还是靠运气 #
27501次浏览 313人参与
# 毕业旅行去哪玩儿 #
21853次浏览 148人参与
# 硬件人秋招进展 #
265519次浏览 3971人参与
# 职场新人体验 #
160698次浏览 1148人参与
