关注
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
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
3393次浏览 43人参与
# 找工作的破防时刻 #
251252次浏览 1948人参与
# 程序员找工作至少要刷多少题? #
7015次浏览 114人参与
# 程序员能干到多少岁? #
5045次浏览 79人参与
# 论秋招对个人心气的改变 #
4959次浏览 86人参与
# 一张图晒一下你的AI员工 #
2370次浏览 58人参与
# 刚入职的你踩过哪些坑 #
3383次浏览 73人参与
# 为了减少AI幻觉,你注入过哪些设定? #
1427次浏览 42人参与
# OPPO求职进展汇总 #
770613次浏览 5395人参与
# 牛客AI体验站 #
2529次浏览 73人参与
# 我现在比当时_,你想录用我吗 #
3160次浏览 50人参与
# AI Coding的使用心得 #
1939次浏览 47人参与
# 关于春招/暑期实习,你想知道哪些信息? #
3356次浏览 71人参与
# 晒晒你司的新年福利 #
3199次浏览 55人参与
# 腾讯工作体验 #
563104次浏览 3688人参与
# 实习,不懂就问 #
164320次浏览 1461人参与
# 如果公司降薪,你会跳槽吗? #
138749次浏览 890人参与
# 软开人,秋招你打算投哪些公司呢 #
180375次浏览 1386人参与
# 非技术岗是怎么找实习的 #
288545次浏览 2586人参与
# 暑假倒计时,你都干了些啥? #
40416次浏览 216人参与