美团一面

自我介绍

项目拷打:(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 来支付。而且创建订单本身并不耗时,直接同步返回就好了,然后让用户付钱。 可以采用同步创建订单,异步扣减库存。因为扣减库存可能需要花点时间,这部分就可以做异步。扣减成功,发个短信通知;扣减失败,发短信+退款。
4 回复 分享
发布于 03-25 13:15 浙江
不是的 lua脚本如果中间一步出错 前面已执行的命令不会回滚
1 回复 分享
发布于 03-20 16:31 上海
我觉得问题3的点在于redis是单线程模型 所以多个线程访问最后一个库存也不会有并发问题
1 回复 分享
发布于 03-23 22:27 安徽
接好运
点赞 回复 分享
发布于 03-20 15:54 上海
点评题目3怎么解,我记得lua脚本好像用在释放分布式锁那里
点赞 回复 分享
发布于 03-20 16:01 上海
base哪里的啊
点赞 回复 分享
发布于 03-20 17:13 四川
佬,项目打算怎么提升啊
点赞 回复 分享
发布于 03-20 18:16 江苏
mark
点赞 回复 分享
发布于 03-20 18:40 湖北
佬,哪个部门啊
点赞 回复 分享
发布于 03-20 21:56 陕西
什么部门呀
点赞 回复 分享
发布于 03-20 22:14 上海
校友好,我也今天下午面的,想问问现在状态有变化吗
点赞 回复 分享
发布于 03-20 22:19 四川
接好运
点赞 回复 分享
发布于 03-20 23:41 四川
佬,问问17是什么意思
点赞 回复 分享
发布于 03-22 00:42 广东
佬,你可知道面试过程中算法题是共享的还是说必须提交面试官才能看到
点赞 回复 分享
发布于 03-23 11:19 上海
楼主的订单超时是怎么做的
点赞 回复 分享
发布于 03-24 14:04 吉林
佬美团一面过了吗
点赞 回复 分享
发布于 03-24 17:15 北京
请问 这里提到的订单超时 是什么意思呀 是自己实现的额外功能吗
点赞 回复 分享
发布于 03-25 10:16 北京
lua脚本肯定保证不了并发,保证并发安全是分布式锁,而且lua脚本也不是严格的原子性。
点赞 回复 分享
发布于 03-25 10:46 广东
m
点赞 回复 分享
发布于 03-27 23:57 四川
佬,可以看下简历吗Orz
点赞 回复 分享
发布于 04-02 22:00 天津

相关推荐

问题:1. 自我介绍 3min2. 问项目概述, 然后问你做了哪些部分 3. 为什么要状态机? 状态机的选型有什么依据4. 那redis 分布式锁是怎么用的, 如果有人占了一直不取消怎么办?5. 导出优化中, 分析是怎么做的, 具体是怎么优化的?各自因素开销占比多少? 接口超时怎么办?6.  讲一下你对Mysql索引机制的理解?7. 实际使用用过哪些索引?8. 事务隔离级别; 你们项目用什么级别? 怎么实现可重复读?9. Kafka ? 可以做到保顺序吗?10. 怎么做到高可用? 11. 用过redis? redis 用过哪些数据结构?有哪些数据结构?12. 问了下另一段实习经历;感觉就是确认我是不是干了活。。13. 消息消费失败了怎么办?14. 如果回过头来做? 怎么做到不丢消息?算法题: 二叉树层序遍历队列5分钟秒了回答: 1. 自我介绍2. 先说项目总体概述1min 然后说自己负责的部分3. 状态机的选型是为了定下业务模型, 状态机有三个核心参数可以作为统一的模型去丝滑的完成所有的状态流转, 同时具备单机cas加锁以及持久化机制至DB, 具备拓展性, 有新的需求不需要单独写接口和业务代码, 而是在配置类里面实现就可以。4. 分布式锁的原因是用来保证数据一致性, 因为操作的对象我们认为是暴露出来的问题, 很容易被多人操作, 会出现分布式线程不安全的问题, 故采用分布式锁, 每个人操作前必尝试获取锁, 同时锁就限定5分钟操作时间, 每个人操作完也会释放锁, 取消Redisson自动看门狗机制, 在实际提交前还需要校验现在当前操作人是否持有锁, 否则拒绝5. 因为一开始导出就是复用了查询的逻辑但是数据量暴增很容易OOM并且耗时很长故需要优化; arthas 分析stack 耗时, 分为网络(对外调接口)和sql开销, 46开, 对外调接口部分删掉不必要然后第一次查询存下数据; sql部分为防止OOM 采用分批分页的形式每次查100个, order by id ,用上次最后的id 作为下次查询的游标, 不仅可以走主键索引而且避开了深度分页的情况;接口肯定要超时,  先响应返回结果, 后台异步完成了后软件通知连接6.  底层b+树, 分为主键索引、普通索引、唯一键索引、组合索引; 主键:不能为null 唯一性; 普通; 唯一键可以为null 但是不能重复; 组合 按顺序排序索引 7. 都用过。8. RU RC RR 可串行, 分别解决了脏读、 读不可提交、 读可提交、幻读的问题;用的是默认级别RR; MVCC 机制, RR是在第一次select 时候创建readview, 算法是根据max_trx_id、 min_trx_id本次事务id 去看是否处于活跃事务id中还是非活跃事务id 中, 如果不允许,则根据undolog 形成的版本链回退直到处于非活跃区间,则可以读; 本质上是一种快照读的形式, 不影响其他事务更新; 9. 两种, topic 里面只给一个分区; 生产消费都在一个分区里面;因为分区内有序但是topic内不有序10.  高可用机制:就是说如果broker 挂了依旧可以支持服务, 原理是分区有多个副本, 主分区负责读写, 从分区负责同步, 分区分布在不同的broker上, 一旦有主分区挂了, 会有选举机制让从分区顶上成为主分区; 又因为kafka具备持久化的刷盘机制, 定时以segement形式把消息存在磁盘里, 故如果所有的broker都挂了, 消息仍然在磁盘里, 重启broker可以恢复 11. string 缓存数据 或者加锁setnx list存队列 hash 存对象 zset 用来做排行榜 set 用来做交集并集去重 hyperloglog做uv统计, bitmap做标志位识别12. 也是讲没写的项目;具体讲效果13.  会重试?重试次数超过了就丢掉不用了?14.  首先消息队列作为一个中间件是不会丢消息的从生产者获取到的消息一定会发送给消费者, 所以只需要考虑消费者这端; 可以用队列或者单表去存储 收到的消息, 如果没有消费完保存待重试的状态; 后台开一个线程或者定时任务去巡检 单表扫没有消费的消息, 如果还是超过了某个阈值比如10次都没有成功, 我们会认为很可能是下游服务出现了问题, 做预警并彻底断死 只允许人工来看。 面试官说我思路非常好。。。15. 反问部门业务也是做高并发的场景, 负责营销活动, 各种大促, 很多同事跳槽去了XXX哈哈哈哈哈, 美团混元体系的搭建; 别的也挺重要挺杂的事情, 场景高并发有很多, 有很多上百亿的数据, 接口填劵10wqps16. 当场约二面
查看14道真题和解析
点赞 评论 收藏
分享
评论
24
179
分享

创作者周榜

更多
牛客网
牛客企业服务