美团一面
自我介绍
项目拷打:(30min)
项目一:
1. 确保用户会话状态的持续性是怎么做的(刷新redis中token的TTL)
2. 如何防止超卖(项目中写的乐观锁,面试官问判断库存大于0也算是乐观锁吗)
3. 用lua脚本保证原子性就可以防止并发情况的超卖问题吗?问两个线程都同时访问到最后一个库存进行下单怎么办。面试官一直问这点,给我问的不自信了。
4. 分布式锁lua脚本用来干嘛了
5. 订单超时怎么实现的(监听redis key过期)
6. 订阅key过期底层原理
7. key超时删除机制
8. redis超时删除的底层原理(就是惰性删除和周期删除原理,X)
9. 用redis做订单超时时间准确吗(不会,因为redis惰性删除和周期删除,所以订单存在时间会比设置的时间长)
10. 消息队列怎么实现订单超时处理
11. 缓存中的订单状态发生改变了怎么办
12. 为什么要redis做缓存(因为快?)
项目二:
13. 航班从查询到下单的全过程
14. 问了一堆并发情况下座位的分配问题,给我问麻了。(还是没有做明白这部分)
15. 消息队列如何异步处理订单的(说我消息队列这里异步处理订单用户体验会很差)
16. 消息队列有哪些异步处理的场景(X)
17.
八股拷打:(10min)
18. HashSet如何判断有没有相同的值(HashMap的containsKey原理)
19. 线程池参数及作用
20. 说说Spring IOC及其好处(麻了,几个spring的问题回答的都是一坨,还没复习到这T-T)
21. Spring bean的作用域(X)
22. bean是单例还是多例,单例的好处
23. 说说Spring MVC流程(更是一坨)
24. MySQL InnoDB默认隔离机制
25. 可重复读如何防止幻读,还会发生幻读吗
26. Redis持久化机制,及其优缺点
27. Redis 网络模型
算法题:129. 求根节点到叶节点数字之和。(刚把dfs方法声明了突然要求使用非递归,但也是直接bfs 5min拿下,也算是第一次把算法题做出来,之前两次tx面试都没做出来,还有三次面试没有做算法题)
总结:项目还是不明不白的,还得多看看项目。spring还没看,得继续沉淀。其他的还得继续巩固,有些细致的东西还是没记住。
(其实感觉有点压力面的味道,但不知道是不是。一直问我lua脚本保证原子性就可以解决并发,不会超卖了吗。难道不是吗
)
项目拷打:(30min)
项目一:
1. 确保用户会话状态的持续性是怎么做的(刷新redis中token的TTL)
2. 如何防止超卖(项目中写的乐观锁,面试官问判断库存大于0也算是乐观锁吗)
3. 用lua脚本保证原子性就可以防止并发情况的超卖问题吗?问两个线程都同时访问到最后一个库存进行下单怎么办。面试官一直问这点,给我问的不自信了。
4. 分布式锁lua脚本用来干嘛了
5. 订单超时怎么实现的(监听redis key过期)
6. 订阅key过期底层原理
7. key超时删除机制
8. redis超时删除的底层原理(就是惰性删除和周期删除原理,X)
9. 用redis做订单超时时间准确吗(不会,因为redis惰性删除和周期删除,所以订单存在时间会比设置的时间长)
10. 消息队列怎么实现订单超时处理
11. 缓存中的订单状态发生改变了怎么办
12. 为什么要redis做缓存(因为快?)
项目二:
13. 航班从查询到下单的全过程
14. 问了一堆并发情况下座位的分配问题,给我问麻了。(还是没有做明白这部分)
15. 消息队列如何异步处理订单的(说我消息队列这里异步处理订单用户体验会很差)
16. 消息队列有哪些异步处理的场景(X)
17.
八股拷打:(10min)
18. HashSet如何判断有没有相同的值(HashMap的containsKey原理)
19. 线程池参数及作用
20. 说说Spring IOC及其好处(麻了,几个spring的问题回答的都是一坨,还没复习到这T-T)
21. Spring bean的作用域(X)
22. bean是单例还是多例,单例的好处
23. 说说Spring MVC流程(更是一坨)
24. MySQL InnoDB默认隔离机制
25. 可重复读如何防止幻读,还会发生幻读吗
26. Redis持久化机制,及其优缺点
27. Redis 网络模型
算法题:129. 求根节点到叶节点数字之和。(刚把dfs方法声明了突然要求使用非递归,但也是直接bfs 5min拿下,也算是第一次把算法题做出来,之前两次tx面试都没做出来,还有三次面试没有做算法题)
总结:项目还是不明不白的,还得多看看项目。spring还没看,得继续沉淀。其他的还得继续巩固,有些细致的东西还是没记住。
(其实感觉有点压力面的味道,但不知道是不是。一直问我lua脚本保证原子性就可以解决并发,不会超卖了吗。难道不是吗
全部评论
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 来支付。而且创建订单本身并不耗时,直接同步返回就好了,然后让用户付钱。
可以采用同步创建订单,异步扣减库存。因为扣减库存可能需要花点时间,这部分就可以做异步。扣减成功,发个短信通知;扣减失败,发短信+退款。
不是的 lua脚本如果中间一步出错 前面已执行的命令不会回滚
我觉得问题3的点在于redis是单线程模型 所以多个线程访问最后一个库存也不会有并发问题
接好运
点评题目3怎么解,我记得lua脚本好像用在释放分布式锁那里
base哪里的啊
佬,项目打算怎么提升啊
mark
佬,哪个部门啊
什么部门呀
校友好,我也今天下午面的,想问问现在状态有变化吗
接好运
佬,问问17是什么意思
佬,你可知道面试过程中算法题是共享的还是说必须提交面试官才能看到
楼主的订单超时是怎么做的
佬美团一面过了吗
请问 这里提到的订单超时 是什么意思呀 是自己实现的额外功能吗
lua脚本肯定保证不了并发,保证并发安全是分布式锁,而且lua脚本也不是严格的原子性。
m
佬,可以看下简历吗Orz
相关推荐
03-29 10:16
门头沟学院 Java 点赞 评论 收藏
分享

点赞 评论 收藏
分享