美团后台一面面经

上来也没让我自我介绍,直接开始
1.项目
2.如果缓存雪崩,大量请求直接打到数据库怎么办?(这答得不是特别好)
3.hashmap扩容多大,为啥
4.equals和==区别
5.为啥重写equals一定要重写hashcode
6.现在需要进行字符串拼接操作,让你做,你会怎么做,为什么
7.为啥不用String的加号
8.String a="a";String b="b"; 问"a" "b"等不等于a b
9.volatile相关,没有问原理,问的是具体问题,就是与可见性相关
10.数据库用的mysql是吧?做过索引优化不?explain语句出来的结果中的type如果为index是啥意思
11.间隙锁锁的是数据还是索引
12.间隙锁解决的是啥问题
13.幻读会在哪种隔离级别中出现
14.如何解决幻读
15.了解TCP不,TCP断开连接的过程说一下(四次挥手)
16.知道time_wait吗?为啥要有这个状态
17.SpringMVC中容器的bean能访问到Spring容器中的bean吗?反过来呢
18.事务传播(不太会)
19.用过事务吗?如果spring的事务中抛出了IOException,会回滚吗?(我猜的会,但是好像是并不会回滚。。)

20.线程wait了,被notifyall了,变成啥状态了
21.线程wait了会不会释放锁

22.mybatis的#好处

23.我看你用了threadlocal,说说(我是结合源码说的)

还有最后他问了我个问题,你想没想过做算法。。我说我本科,都没接触过。。尴尬
就记得这么多了。。
总结:都不是直接问原理,但是都偏向于给一个场景或者具体问题,问你怎么想,让你给出解决办法,然后问你为啥,这块基本就要结合原理和思考来说了,看来平时除了多看看理论还是要多敲一敲,多思考

#美团##面经##校招##Java工程师#
全部评论
缓存相关也做了个大概总结,分享一下吧,从网上看得资料 解决缓存的相关问题 a.缓存穿透的问题: 解决方案: 1.布隆过滤器 把所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉 2.如果一个查询返回的数据是空的,无论数据是否存在,还是系统故障,我们仍然将这个空结果进行缓存,但设置很短的过期时间 b.缓存雪崩的问题: 设置缓存的时候采用了相同的过期时间,导致缓存在同一时刻失效,请求全部转发到db,db压力瞬间变大雪崩。 解决方案 1.用加锁或者队列的方式保证缓存的单线程写,避免失效时大量的并发请求落到底层的存储系统上 2.将缓存的失效时间分散开,在原来失效时间的基础上加上一个随机值,比如说1-5分钟的随机,这样每一个缓存过期时间的重复率就会降低,很难引起集体失效的事件。 c.缓存击穿的问题。对于一些设置了过期时间的key,这些key某些时间点被超高并发地访问,是非常热点的数据,缓存在某个时间点过期的时候,恰好这个时间节点对这个key有大量的并发请求过来,这些请求发现缓存的key过期就一般都会从后端数据库请求数据并且设置到缓存,大的并发请求就可能会压垮后端db 解决方案 1.使用互斥锁(mutex) , 在缓存失效的时候,判断拿出来的值为空,不立即去load db,而是先使用缓存工具的某些带有返回值的操作(比如说redis的setnx),去set一个mutex key,当操作返回成功的时候,在进行load db的操作并且设置回缓存,否则,就重试整个get缓存的方法。 String get(String key){     String value = reids.get(key);     if(value == null){         if(redis.setnx(key_mutex,"1")){             reids.expire(key_mutex,3*60);             value = db.get(key);             redis.set(key,value);             redis.delete(key_mutex);         }else{             //其他线程休息50ms后重试             Thread.sleep(50);             get(key);         }     } } 2.设置热点数据永不过期 a.从redis上来看,确实不设置过期时间,保证不会出现热点key过期的问题,也就是物理上的不过期 b.从功能上看,我们把过期时间存在key对应的value里面,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,设置"逻辑"过期时间 String get(final String key){     V v = redis.get(key);     String value = v.getValue();     long timeout = v.getTimeout();     if(v.timeout <= System.currentTimeMillis()){         //异步更新后台异常执行         threadPool.execute(new Runnable(){             public void run(){                 String keyMutex = "mutex:"+key;                 if(redis.setnx(keyMutex,"1")){                     //设置三分钟的超时                     redis.expire(keyMutex,3*60);                     String dbValue = db.get(key);                     redis.set(key,dbValue);                     redis.delete(keyMutex);                 }             }            });     }   } 3.提前使用互斥锁 在value内部设置一个超时值(timeout1),timeout1比实际的mem*** timeout(timeout2)小,当从***读取到timeout1发现它已经过期的时候,马上延长timeout1并重新设置到***。然后再从数据库加载数据并且设置到***中 v = mem***.get(key); if(v==null){     if(mem***.add(key_mutex,3*60*1000) == true){         value = db.get(key);         mem***.set(key,value);         mem***.delete(key_mutex);     }else{         sleep(50);         retry();     }else{         if(v.timeout <= now()){             if(mem***.add(key_mutex,3*60*1000) == true){                 v.timeout += 3*60*1000;                 mem***.set(key,v,KEY_TIMEOUT*2);                                  //从数据库加载最新的数据                 v = db.get(key);                 v.timeout = KEY_TIMEOUT;                 mem***.set(key,value,KEY_TIMEOUT*2);                 mem***.delete(key_mutex);             }else{                 sleep(50);                 retry();             }         }     } }
点赞 回复 分享
发布于 2019-08-26 17:55
学习帖,有关time_wait的一些总结 服务器端出现大量的TIME_WAIT连接的原因 TIME_WAIT是主动关闭连接的一方保持的状态,在发起主动关闭连接后,发送完最后一次ACK包之后,就会进入到这个状态,然后在保持这个状态2MSL(max segment lifetime) 时间之后,彻底关闭回收资源。 为什么要保持这一段时间的资源呢?原因有下面两个方面 防止上一次连接中的包,迷路后再次出现,影响新的连接(经过2msl,上一次连接的所有的重复包都会消失) 可靠的关闭tcp连接。在主动关闭方发送最后一个ack(fin)是有可能丢失的,这个时候被动方会重新发送fin,这个时候如果主动方处于CLOSED状态,就会响应rst而不是ack。所以主动方要处于TIME_WAIT状态而不是CLOSED。另外这么设计TIME_WAIT会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。 解决思路:快速回收和重新用哪些TIME_WAIT的资源 应用层面: 避免频繁关闭连接,如业务优化或者使用长连接等. 系统层面: 1.缩短msl时间 2.增加可用端口的数量 msl时间修改: 默认为2分钟 查看:sysctl -a | grep time | grep wait vi /etc/sysctl.conf net.ipv4.tcp_fin_timeout = 30 执行 /sbin/sysctl -p让参数生效 进行一些参数的配置 net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle的开启都是为了回收处于TIME_WAIT状态的资源。 net.ipv4.tcp_fin_timeout这个时间可以减少在异常情况下服务器从FIN-WAIT-2转到TIME_WAIT的时间。 net.ipv4.tcp_keepalive_*一系列参数,是用来设置服务器检测连接存活的相关配置。 我看的文章链接 https://zhuanlan.zhihu.com/p/60382685 https://zhuanlan.zhihu.com/p/45102654
点赞 回复 分享
发布于 2019-08-26 17:48
楼主约二面了吗
点赞 回复 分享
发布于 2019-08-26 20:48
第8题怎么分析的呀
点赞 回复 分享
发布于 2019-08-26 16:18
哪个大佬知道 close_wait 的具体作用 求私聊
点赞 回复 分享
发布于 2019-08-26 14:41
卧槽
点赞 回复 分享
发布于 2019-08-26 13:39
面了多久啊?
点赞 回复 分享
发布于 2019-08-26 13:09
蛮全面的...有些也不好答
点赞 回复 分享
发布于 2019-08-26 12:59
请问16.17怎么回答
点赞 回复 分享
发布于 2019-08-26 12:50
楼主前几天做过笔试吗
点赞 回复 分享
发布于 2019-08-26 12:49
现场面的吗
点赞 回复 分享
发布于 2019-08-26 12:46

相关推荐

04-24 13:51
已编辑
西安电子科技大学 Java
👋个人背景:211计算机混子,代码能力一般,春招急头白脸参加央国企最后拿下这两个offer👏offer1:中广核工程公司驻陆丰仪控调试,待遇19+4,离家1800km💯offer2:张家口卷烟厂待遇未知,应该有13个(猜测),离家500km牛油们帮忙选一下,家里人不是很喜欢卷烟厂这个offer,但是蜀黍烟草局下岸了
鸿雁于飞:先说offer1:中广核工程公司驻陆丰仪控调试(待遇19+4) 中广核这艘央企大船还是很稳的,集团综合效益稳居央企前列。但你得搞清楚,这个19+4的"19"是总包,不是到手数——招聘宣传待遇里把所有能算的都算进去了,饭卡福利积分啥的全包含,有牛油分享实际到手大概打七折。试用期到手可能就四五千的水平,转正后基本工资4800左右,其余靠绩效、年终、大修费撑着。不过核电的工作环境有点"牢笼感"——核电站位置偏僻,远离繁华都市。工程公司是承包商性质,干活比业主公司累,而且大概率要经常出差,有的岗位年出差天数100天以上。最大问题是你这1800km的距离过于离谱,核电员工工作强度最小的时候一周也就回一次家,离得远回家成本高,夫妻感情和亲子关系都是现实考验。说白了:高薪是拿青春和生活换的。 再来看offer2:张家口卷烟厂(待遇约13个) 张家口卷烟厂是河北中烟下属三家卷烟厂之一,河北中烟主打的"荷花"系列连续多年位居全国高端卷烟品牌销量前列。烟草系统薪资由基本工资+绩效+年终奖构成,综合年薪普遍显著高于当地平均水平,六险二金齐全,福利拉满。有人问"13个是不是太平平无奇了"——关键张家口是四线城市,生活成本低,这13万的购买力相当于深圳的二十多万。离家500km,开车半天到家,周末回趟家完全可行,幸福感直接上两个档次。中广核的牛油说了句大实话: "哪个核电站好?永远是离家近的那个最好。" 选烟厂同理。 但是,卷烟厂的坑你得清楚: 首先卷烟厂和烟草局不一样,卷烟厂是生产操作类岗位,很多要三班倒。报考条件明确写了要能"胜任夜班工作和长时间站立工作"。一线操作工每天盯着流水线卷烟,工作内容高度重复,有入职的人描述为"食之无味弃之可惜"。有牛油直言"卷烟厂和商业性质的烟草公司不一样,前者很坑很累"。其次你家里人不是不喜欢,而是担心你这211计算机科班出身,进了烟厂干操作工,技能会快速退化,未来如果行业改革,技术壁垒不高,转行比较困难。等你干两年再跳出来,技术栈全忘干净了,回头再去敲代码,发现连应届生都卷不过。 老牛油的灵魂三问: 1. 你是更怕穷,还是更怕想家? 如果特别恋家的人跑1800km之外,第一年哭鼻子的概率高达80%。陆丰那地方偏僻单调,核电基地又远又闷,闲下来除了打游戏没啥娱乐,社交圈也窄。找个对象都费劲——牛油亲测核电站"狼多肉少"。 2. 你的代码能力有多"一般"? 如果真的一般,仪控调试和你专业匹配度不算高,这活儿主要是工程改造设计、现场实施管理、在建机组设计审查等,偏工程向而非纯软开。干两年后跳回互联网赛道,竞争力不一定有明显提升。反倒是烟厂不需要你写代码,进去就是稳定躺平。 3. 烟草局下岸这事儿会不会让你耿耿于怀? 如果烟草局是你第一志愿,烟厂只是plan B,那得想清楚:进去了可能每天看着天花板想"如果当初去了烟草局该多好",这种内耗比钱少还折磨人。如果你能接受"反正都是烟草系统,先进去再说"的心态,那倒无所谓。 一句话总结: 如果年轻想拼想闯做技术积累,中广核虽然累和远,但简历上央企核电的金字招牌确实有含金量,加上到手收入在这两个选项里确实更高,考虑到你个人经济情况和家庭状况,假如家里不需要你常回去照顾,家里有兄弟姐妹帮手分担,那先去核电待三四年,积累经验再跳槽也不失为一步棋。 如果想安稳过日子离家近当"人上人",烟厂低线生活成本加持,加上稳定的编制和福利体系,在张家***得滋润,幸福感吊打陆丰。尤其家里人是那种离不开你的,有烟厂的稳定且离家近,比任何高薪都实在。
点赞 评论 收藏
分享
03-28 16:43
佛山大学 Java
不知该咋办:简历2.0,各位佬看看,这样可以吗查看图片
点赞 评论 收藏
分享
评论
5
152
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务