小红书
问题 | 答的 | 查到的结果 |
---|---|---|
ES周边搜索的原理 | 不会 | GeoHash |
redis的expire的原理 | 不会 | 可行的3个方案:定时删除、惰性删除、定期删除 实际实现:定期删除+惰性删除 |
int数组,都是正数,返回下一个刚好比当前数大的数,这样的一个数组 | 不会 | https://blog.youkuaiyun.com/smileiam/article/details/88732245 延伸:https://leetcode.com/problems/next-greater-element-ii/?tab=Description |
int数组,升序的,后半段放到前半段,类似 4 5 6 1 2 3 这样,在这个数组中查找一个数 | 不会 |
猿辅导
问题 | 答的 | 查到的结果 |
---|---|---|
java多线程 线程池的作用是什么、如果让你实现线程池,你会怎么搞,怎么调度/唤醒线程,提示了生产者/消费者模型 | 不会 |
|
线程池的几个参数是什么 | core、max、queue、存活时间、rejectHandler 0 -> core -> max -> 队列 -> reject 这个答<错>了 | 还有个ThreadFactory参数 0 -> core -> 队列 -> max -> reject |
写段代码,有个缓存每5分钟失效,保证更新缓存时不会更新多次 |
| 角度一:应该是考察双重检查锁定,字段要有volatile 角度二:缓存的防击穿 |
redis 分布式锁,怎么实现的 | Spring AOP、注解、底层是redis的setnx | 延伸:
|
expire,原理是什么 | 不会 | 可行的方案:定时删除、惰性删除、定期删除 redis实际采用的方式:惰性删除+定期删除(定期删除随机选一些过期key来删,没有删全部的) |
多个setnx请求,redis服务怎么保证没有并发问题的 | redis服务器是单线程的,所以没有问题 看面试官反应,好像是答错了 | IO多路复用:https://www.cnblogs.com/darknebula/p/10072658.html ? |
map怎么扩容的 | 不会,答了HashMap的扩容原理 | 有个ht[2]数组,平时数据存在ht[0]扩容时从ht[0]往ht[1]扩,扩容过程是逐步的,扩容完数据设置回ht[0] |
es node有哪些类型(master、slave、还有啥) | master、slave | master、主资格、data、client 部落节点。。。 |
查询过程是什么样的 | 请求打到某个节点,作为协调节点 。。。。 |
|
协调节点怎么知道其他节点的存在的 | 协调节点会先问一下master节点,答错了 | 。。。。 |
es的索引和mysql的索引,有什么区别 | es的索引是倒排索引,MySQL的索引是B+树 倒排索引的原理balabala B+树的原理balabala | es的索引只有倒排索引吗? |
mysql b树和b+树的区别是什么 | b树的叶子节点没有兄弟节点的指针,B+树有 | 还有一个:B+树只有叶子节点才存数据 |
范围查询用b+树索引,那等值查询用什么索引 | 自适应hash索引 |
|
自适应hash索引有什么缺点(还是特点来着?) | 不能调优 |
|
算法 int链表,调整成奇数在左,偶数在右 |
|
|
多叉树,带depth的深度复制 |
|
|
OPPO
|
|
|
---|---|---|
业务: 标签:快速找到其group,怎么且/或复合查询 | 内存hashmap缓存 |
|
门店数据更新,怎么感知更新的 | mdc消息通知,收到id去查最新数据并更新 |
|
公私海轮转有啥难点没,怎么配置的 | 规则比较复杂 基于战区配置,配置项很多 | 先讲轮转目的:提高资源的产出,从拜访/签约/业绩维度 演进思路:可以引入规则引擎 |
门店数据怎么分库分表 | 以业务分库,以门店id水平分表 | 分库分表,跟查询是有关的 现阶段使用ES查询,所以以poi单维度分表是可行的 如果使用数据库搜索,需要再考虑 |
过程数据(拜访)数据量多大,怎么存的 | 。。。 | 如果量大,思路:
|
ES Solr、ES选型 | 性能、稳定性、学习成本、运维成本 | doc_values是lucene的 |
查询过程 | 请求打到协调节点 如果根据id来get,则根据路由规则找shard,然后找node;查找完返回协调节点 如果是query,则发到所有shard的node,再由协调节点处理数据,并返回 | |
脑裂的处理(单集群、多集群场景) | 比如单集群双机房部署,在第3个机房加入无数据的选举节点 不使用多集群了 |
|
多集群怎么高可用 | 读高可用,写无同步,废弃了 |
|
有没有跨城的集群 | 无,延迟高、带宽贵 |
|
es是自己搭的吗 | 开始是,后来移交了 |
|
mysql | b+树索引,还有hash索引,b+树索引的原理 |
|
回表、索引覆盖 | 略 |
|
自适应hash索引原理 |
|
|
深度分页的问题&如何优化 | 排序过多 limit 100, 10 改为 where >= arr[100] limit 10 |
|
并发 |
| sync & lock |
java实现setnx;扩展:加上超时(答的unsafe的 | concurrentHashMap,{int state}作为value,使用unsafe.compareAndSwap,初始化时使用putIfAbsent |
|
10亿ipv4的ip,寻找其中重复的 | 使用2^32bit的内存,int[2^29]来存各个ip是否出现过 | 扩展:内存不够 |
|
|
|
--------分割线--------下面是二面---- |
|
|
为啥看机会 | 。。。 |
|
服务治理了解不 | 不了解,只知道有服务发现,负载均衡 | 核心是服务注册&发现 |
负载均衡讲讲 | 。。。轮询 | 轮询、随机、最少请求、最小负载、一致性hash |
最有成就感的事 | es迁移 | 侧重考察:你看重哪些东西,如技术、别人的认可等 |
ES迁移怎么选型的 | 性能、稳定性、学习成本、运维成本 |
|
服务稳定性都有哪些考量因素 | 分库分表、缓存设计(他说这属于性能相关的) | 新美大事故分析与总结 看里面的四 见:架构.xmind |
性能优化的角度 |
| |
压测怎么压的,有没有全链路压测 | 线上单机摘掉流量,单接口/全接口流量回放 无全链路压测 | 重点在于出现了哪些问题,怎么解决的,比如cpu报警、jvm崩了 全链路压测可以说,虽然不涉及全链路压测,不过了解过一些 |
最无力的事,你怎么做的 |
| 侧重考察:面对这些问题,你是怎么解决、处理的 如:上面压下来需要推动的事,别人不好推,我跟他交流,看他遇到什么困难我帮他都解决掉 |
有没有负责一个项目或者带人做 | 代理商结算 | 重点侧重:项目管理、当主R、横向项目如何推进 |
最近在学习啥新东西 | 无 | 比如答一下leaf就可以 |
水滴
|
|
|
---|---|---|
美团服务治理还用的thrift是么,服务治理是啥 | 围绕服务注册、服务发现 |
|
服务注册、发现是怎么做的 | 底层基于zk |
|
java8 G1收集器 | 无新生代、老年代, |
|
java8有没有永久代 | 没了,改成方法区了,方法区也可以回收,怎么回收答得乱乱的 |
|
并行流 | 使用ForkJoinPool,默认的线程数是cpu核数-1 |
|
zk满足CAP的哪些 | P一定要满足,可用性可要保证,牺牲了一定的一致性 | zk就是非强一致的,但是保证了最终一致性(不是) zk保证CP,不保证A |
AtomicInteger原子性的实现 | unsafe.compareAndSwap | |
unsafe.compareAndSwap()怎么实现的 |
| 汇编 cmpxchg指令,多核才加 lock 指令 |
volatile的作用 |
| a=1,x=b; b=2, y=a;不该但是可能出现结果x=y=0 《并发编程的艺术》p24 |
volatile能不能保证原子性 | 不能 |
|
信号量的作用 | 一段代码最多只能有n个线程在执行 | 控制并发线程数 |
信号量怎么实现的 | 不会,用ReentrantLock的共享锁类似的思路可以实现 | 信号量内部的Sync继承AQS,state设置为信号量值 每当一个线程来了,就试图用cas的方式给state减1,如果减到负值就cas失败,然后线程就开始等待 |
MySQL有哪些事务隔离级别,分别解决的哪些问题 |
|
|
MySQL有MyISAM和InnoDB,说说区别 | InnoDB:支持事务、行锁、聚簇索引、5.6以后支持全文索引 MyISAM:查全表记录的数量较快 | InnoDB还支持外键 |
主键索引、辅助索引的区别 | 主键索引叶子节点存了记录,辅助索引叶子节点只存主键指针 回表、索引覆盖e |
|
最近在学习什么 | 美团的分布式id生成器,leaf |
|
leaf怎么保证多个请求来的时候,id不重复 | 使用AtomicInteger | 获取id的方法加了synchronized https://tech.meituan.com/2017/04/21/mt-leaf.html (美团的订单号怎么生成(场景),业界有那些开源的生成方式,原理是什么,各有什么优缺点) |
阿里
|
|
|
---|---|---|
Solr、ES选型时候,有没有调研其他的数据库 | 自建 geoHash&倒排,代价太大 | 这块确实不了解,问了不少同学,说Solr/ES已经足够具有代表性,就没有再调研其他数据库 |
AOP的顺序,有哪些实现方式 | interceptor的配置文件定义优先级 |
|
redis怎么存的 | string | 用到了map、zset |
zset怎么保证有序 | 不会 | ziplist和skiplist |
kafka能不能支持消费的优先级 | 不能,partition里是顺序的 |
|
如果需要kafka支持优先级,要怎么做 | 使用最大堆存储消息 | |
最大堆的上移/下移的时间复杂度 | 由于堆的层数是log(n),所以复杂度为O(log(n)) |
|
thrift和http的区别 | 都是应用层的,thrift基于二进制,http基于文本 | thrift是个RPC框架,http是个应用层协议 https://www.zhihu.com/question/41609070 RPC是一种编程模式,把对服务器的调用抽象为过程调用,通常还伴随着框架代码自动生成等功能。使用RPC做网络服务开发时,通常只需要实现服务器端的一个处理函数,其余的客户端调用,序列化反序列化,方法派发(收到什么样的消息,调用服务器端的什么函数)等都由框架或者生成的代码来完成,较大地减轻了网络服务开发和调用的复杂性。 HTTP是一种应用层网络协议,RPC可以采用自定义协议,也可以通过HTTP协议来传输,thrift,grpc,xml-rpc,json-rpc都是通过HTTP传输的。HTTP既支持长连接,也支持短连接。 |
rpc的流程 | 不会 | 序列化和网络传输 |
你觉得你的优缺点是啥 | 交给我的事,都会有反馈 不会做的事,可能有点急,会求助于有经验的人 |
|
探探
|
|
|
---|---|---|
讲了讲业务,CRM的索引 |
|
|
ES查询有没有使用相关性、score | 模糊匹配时使用score,对应使用query 不需模糊匹配时无需相关性score,使用filter,可缓存 |
|
题目1 前序遍历二叉树,递归、非递归 |
|
|
题目2 并查集 |
|
|
题目3 org、人员树接口设计 |
|
|
restful API 的设计 |
|
|
数据库查询一棵树的优化 |
|
|
这棵树的缓存什么时候更新 |
|
|
对java语言的理解 |
|
|
java的多态 |
|
|
java的包和go的包 |
|
|
可见性修饰符 |
|
|
--------下面是2面 |
|
|
讲讲业务 | 索引怎么迁移的 |
|
CRM的部署架构 | x |
|
系统设计时考虑的点 |
| |
系统稳定性考虑的点 |
| 想要的答案,好像不是围绕“故障的生命周期” |
用的监控都关注哪些指标 |
| 机器、jvm、等 |
------下面是3面------ |
|
|
讲一讲菜品中心 | B/C分离、归一化 | |
300家肯德基上调鸡腿价格怎么办 |
|
|
收银会用菜品中心的价格属性吗 |
|
|
诡异的象限矩阵 |
|
|
------下面是4面 总监------ |
|
|
CRM的难点在哪里 | 门店数据量大、查询逻辑复杂 | 战区的设计 |
MySQL的存储引擎、索引 |
|
|
幻读 & 不可重复读 |
|
|
solr和ES的区别 |
|
|
redis的使用,LRU的原理 |
|
|
如果用java实现O(1)的LRU怎么做 |
| LinkedHashMap |
这几年的成长、做得好/不好的点 |
|
|
洋钱罐
|
|
|
---|---|---|
门店数据怎么存的 | MySQL |
|
solr es | 。。。 |
|
java内存模型,都啥作用 | 虚拟机栈、本地方法栈、PC、堆、方法区 |
|
堆里怎么区分的,有哪些块 | Eden、Survival、Old G1还有H |
|
gc算法有哪些,讲讲g1 | 。。。 |
|
g1大对象怎么放的 | 巨无霸区 |
|
标记清除/整理的优缺点 | 清除有碎片,整理需要有一块空闲内存,浪费空间 |
|
int链表尾对齐相加(禁用反转链表) | stack存节点实现链表逆序 |
|
二面----------- |
|
|
deep copy无向连通图 | 类似层序遍历,hashMap作为origin到copy的映射 |
|
es迁移 | 。。。 |
|
地理位置搜索原理 | geoHash |
|
你们地理位置的geoHash用了几位 | 忘了,反正能精确到米 |
|
怎么对比性能 | 索引模块重构、两个实现分别监控 |
|
迁移怎么保证正确性 | 测试 迁移要点:
|
|
3面 |
|
|
set里的字符串,最少几步变动start到end |
|
|
最近在学啥 做了啥 | Chrome插件 |
|
用过什么比较牛逼的技术 |
|
|
业务用到几台数据库 | 自己业务:1主1从1统计从 兄弟组业务:北京1主1从,上海2从 |
|
58同城
|
|
|
---|---|---|
系统架构 | 画了图给他讲 |
|
es 存储结构,跟mysql区别 |
|
|
redis分布式锁 用哪个命令 几个参数 | 带nx参数的set命令 4个参数:key value expire_time NX |
|
redis主节点挂了怎么办 | 不会 |
|
redis主从怎么复制 | 不会 |
|
synchronized可以用在哪 (field上能不能用 | 可以在class、方法、block上
|
|
synchronized在静态方法 实例方法有啥区别 |
|
|
synchronized跟lock区别 |
|
|
lock在使用上跟sync有啥区别 |
|
|
hashmap结构, |
|
|
并发版hashmap,原理 1.7 1.8 | 1.7分段锁 1.8 Node+链表+CAS |
|
cas原理 |
|
|
红黑树vs二叉查找树 | 没答上来红黑树 |
|
线程池参数,拒绝策略 |
|
|
redis失效策略、怎么实现 |
|
|
雪崩 穿透 击穿 |
| |
算法:并发输出abc: 3个线程分别输入字母a、b、c 每凑够一个“abc”,就输出一个abc | 原子long类,分3段,每段20位的整数,来表示一个字母的个数 //第一步,++该字母的个数 如果是a,newValue = atomicLong.get() +1 << 40; 如果是b,newValue = atomicLong.get() +1 << 20; 如果是c,newValue = atomicLong.get() +1; cas(oldValue, newValue),至成功为止 //第二步,尝试输出abc,至a、b、c至少1个count为0为止 countA = atomicLong.get() >> 40; countB = atomicLong.get() >> 20 % (1 << 20); countC = atomicLong.get() % (1 << 20); if (countA > 0 && countB > 0 && countC > 0) { // cas地把a、b、c的个数各减1 //print("abc") } |
|
算法:背包几种方法填满(递归 |
|
|
排查内存使用过高(top、线程、greys | greys通过trace命令,在线程池构造方法被调用时,查看调用的堆栈,得知哪个地方一直在创建线程池,以排查出问题 |
|
自己设计的什么系统(目标管理 |
|
|
该系统其数据量多大(每月百万量级 |
|
|
|
|
|
二面 |
|
|
天眼怎么做,爬虫怎么做 |
|
|
怎么知道爬虫爬完数据(拉mq 无积压 |
|
|
故障诊断咋做的 |
|
|
es数据怎么容灾(主从分片,不在同一节点 |
|
|
es数据写入流程,主从分片 |
|
|
代理商系统是服务于商家的吗 |
|
|
3亿用户 年增长20% 1w QPS 分表思路 | 考虑单机的极限,包括QPS、存储容量等 如果单机扛得住,可以只分表 如果单机抗不住,需要分库分表 |
|
java里的锁讲讲(sync lock |
|
|
排查cpu过高、内存过高 | 看有没有大量的JSON解析等耗费CPU的操作 jstack看线程状态,看有没有一直runnable的线程,怀疑死循环 jmap看内存 |
|
16g 32cpu 2T,500G的11位手机号去重,扩展:怎么提速 | bitmap去重 提速的话,因为机器是多核,可以把数据分桶然后多线程搞 |
|
|
|
|
3面 |
|
|
crm设计图,架构 |
|
|
es怎么部署的,如何容灾 |
|
|
销售漏斗的流程变了怎么办(流程服务 | 可以使用公司内部的流程平台,反正CRM内部是没做流程引擎 |
|
org树查子孙节点 | org节点加一个字段,0-1-15-322-52342,这种从root到自己的path,然后按path like 'xx-xx-%'查,能用上前缀索引 |
|
跟同事的分歧怎么办 | 。。。沟通嘛 |
|
跟产品的分歧怎么办 | 。。。沟通嘛 |
|
|
|
|
4面 |
|
|
挑个系统画架构(代理商 |
|
|
kafka几个partition | 公司内部MQ平台自己设置的,随口编了“默认10个partition” |
|
序列化的kafka(单partition kafka怎么保证顺序消费 | 只用1个partition,单partition就可以有序了 |
|
如果是单partition怎么高可用(跪了 |
| 他说“我又没说保证顺序消费一定要只用1个partition”... |
微服务框架Spring Cloud/Dubbo/Service Mesh,thrift是框架 |
| 给我讲了康威定律, |
链路跟踪怎么做(trace | 公司内部有个trace,实现方式是ThreadLocal里存一个traceId,在发生调用时,传递这个traceId |
|
java stream的terminal操作讲两个 | 比如 count、reduce |
|
forkjoin,什么任务能fork join | 我说能不能的话,应该一眼能看出来 | 他说这个东西是要有理论依据的。。 |
设计模式,单例太low了 | 我说我知道单例模式,他说太low了 |
|
设计原则,开闭原则你的应用 |
|
|
|
|
|
5面 技术什么大leader |
|
|
怎么对待、处理线上问题 | 先保证服务可用,不影响用户(包括降级、修数据) 后修复bug 然后总结原因 |
|
在美团 工程师文化啥的 感受最深的是啥 | 遇到问题一定要有打破沙锅问到底的精神,特别是偶发和比较诡异的问题。 |
|
|
|
|
hr | 。。。 |
|
滴滴
|
|
|
---|---|---|
项目 solr2es |
|
|
算法:二叉树深度m对应节点有几个 | 我写的层序遍历 |
|
io多路复用 | 讲了下原理,1个线程来查看这些IO有没有ready,有的话通知其他线程 |
|
数据库实现乐观锁 | 没答上来,搜了一下,2面又被问了。。 |
|
linked blocking queue怎么实现 | 一个notEmpty Condition,一个notFull Condition,。。。 |
|
thread local怎么实现 | 就是每个Thread里都有个Map,key是threadLocal的的对象 |
|
代理模式解决哪些问题,都是怎么做的 | todo |
|
|
|
|
2面 |
|
|
crm哪些难度(业务复杂、数据量大 | todo |
|
业务复杂怎么做 | todo |
|
接口怎么设计 |
|
|
接口&mq怎么用 |
|
|
数据量大怎么做(ES |
|
|
数据怎么同步ES(增量/存量兜底/断点续传 |
|
|
性能问题怎么排查(cpu 内存 网络 io |
|
|
new的对象分配在堆上还是栈上 |
|
|
java线程状态的waiting和block区别 |
|
|
归并排序原理,时间复杂度 |
|
|
很多int找中位数(top k/ 桶排序 |
|
|
数据库乐观锁悲观锁 |
|
|
|
|
|
资源定义怎么做的 |
|
|
调用接口有没有限流,服务端还是客户端做 |
|
|
资源搜索给solr写个插件不就行了为啥要迁移es,你迁移一个月也够写个插件了(… |
|
|
看过英文文档没,jvm规范英文版,xx论文 |
|
|
如果服务端限流了,你怎么保证客户端可以获取数据(mq削峰,计数 |
|
|
redis的话计数怎么保证原子性(无cas |
|
|
数据库的默认隔离级别 |
|
|
可重复读下修改记录,另一个事务能不能读到 |
|
|
mtthrift的原理,怎么实现网络通信,nio还是bio |
|
|
sync的实例和静态方法会不会阻塞对方 |
|
|
线程池submit的方法怎么感知结束,同步下一个线程? |
|
|
多线程回调是在哪个线程里执行的 |
|
|
(面完3面我就跑了,下午还有快手的.. |
|
|
快手
|
|
|
---|---|---|
一面 solr2es |
|
|
二面 资源管理难点 |
|
|
三面 crm架构图 |
|
|
条
|
|
|
---|---|---|
一面 怎么保证es/mysql数据一致 |
|
|
二面 门店数据怎么存,怎么分库分表 |
|
|
长银消费金融
|
|
|
---|---|---|
todo |
|
|
|
|
|
华为-公共开发部
|
|
|
---|---|---|
一面笔试 // 3.times do // puts 'hello world' // end
/** 8 间牢房排成一排,每间牢房不是有人住就是空着。
每天,无论牢房是被占用或空置,都会根据以下规则进行更改:
如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用。 否则,它就会被空置。 (请注意,由于监狱中的牢房排成一行,所以行中的第一个和最后一个房间无法有两个相邻的房间。)
我们用以下方式描述监狱的当前状态:如果第 i 间牢房被占用,则 cell[i]==1,否则 cell[i]==0。
根据监狱的初始状态,在 N 天后返回监狱的状况(和上述 N 种变化)。
示例 1:
输入:cells = [0,1,0,1,1,0,0,1], N = 7 输出:[0,0,1,1,0,0,0,0] 解释: 下表概述了监狱每天的状况: Day 0: [0, 1, 0, 1, 1, 0, 0, 1] Day 1: [0, 1, 1, 0, 0, 0, 0, 0] Day 2: [0, 0, 0, 0, 1, 1, 1, 0] Day 3: [0, 1, 1, 0, 0, 1, 0, 0] Day 4: [0, 0, 0, 0, 0, 1, 0, 0] Day 5: [0, 1, 1, 1, 0, 1, 0, 0] Day 6: [0, 0, 1, 0, 1, 1, 0, 0] Day 7: [0, 0, 1, 1, 0, 0, 0, 0]
示例 2:
输入:cells = [1,0,0,1,0,0,1,0], N = 1000000000 输出:[0,0,1,1,1,1,1,0] **/
class ShowMeBug { public static void main(String[] args) { int[] input = { 0,1,0,1,1,0,0,1 }; int days = 2; int[] result = new ShowMeBug().prisonAfterNDays(input, days); System.out.println(java.util.Arrays.toString(result));
}
public int[] prisonAfterNDays(int[] cells, int N) { int length = cells.length; int[] nextDay = new int[length]; for (int i = 0; i < N; i++) { nextDay[0] = 0; for (int j = 1; j < length - 1; j++) { nextDay[j] = 1 - (cells[j - 1] ^ cells[j + 1]); } nextDay[length - 1] = 0; cells = nextDay; } return cells; } } |
|
|
一面 讲架构,从上往下讲(最外层是web、iOS/Android 用的哪些微服务?(美团自研的thrift 用的rest接口吗?(没有,因为rest接口是http的,而http请求有网关单点的风险,所以使用thrift rpc+服务治理的方式 服务治理是怎么搞的,clien怎么知道要调用哪个server?(服务治理的命名服务做的这个事儿,命名服务本质上是个zk,从zk获取server的ip列表 client每次调用都从zk获取server的ip列表吗?(每个client会对他要调用的server节点,监听其节点变化,每当server节点有变化时<如ip的增删改>,会从zk拉取最新的server节点的ip列表,而不是每次调用都获取最新列表 你们的服务是有状态的吗?(服务本身是无状态的,包括操作人等上下文都转化为接口的参数了,但是作为存储的MySQL是有状态的 为什么服务是无状态的,这有什么好处?(无状态的服务便于水平扩展,遇到性能瓶颈时只需要加机器即可;如果服务是有状态的,一方面需要各个服务器间需要进行状态的协调,另一方面加机器也很困难 那如果在服务器间需要是有状态的,比如对一个对象加锁,需要怎么做?(分布式环境下在不同机器上加锁,这就是有状态的了,在无状态的服务上,需要引入有状态的第三方来进行状态协调,我使用的方案是实现分布式锁,是基于redis实现的 具体怎么做?(几个注意点:带nx的set命令,而非setnx命令;如果执行加锁的街舞逻辑过程中,服务宕机了怎么办?设置的redis key一定要有过期时间,且用带nx的set而非setnx;分布式锁的等待机制?基于注解实现,有参数来控制:是死等还是等到超时时间然后报错;没问到的地方:1. 误删其他线程/其他请求的锁怎么办?锁的key对应的value存上线程的唯一id,删的时候校验,仅当删除者==加锁者时候才删 2.针对上面1的情况,如果校验时候value正确,而删的时候key对应的value已经变了,该怎么办?使用lua脚本,将“校验value+删除key”变为原子操作;3.(谁问这个问题谁混蛋)你们用的redis是单机还是集群,如果是集群,那你key刚设置到master节点时,master节点挂了,而key还没同步到slave节点,这时候下一个同一key的分布式锁来的时候,是能直接获取锁的,这需要怎么处理?(这个问题是真的变态)redlock可解,同一个key设置到多个master上,当过半master设置成功时,才认为上锁成功 除了redis,还有哪些方案可以实现分布式锁么?(zk 为什么用redis而不是zk?(我答的原因是,美团的redis服务禁用了虚拟内存,是纯内存的,所以性能更高;但是实际原因应该不止这个,建议网上再查查 分布式锁怎么实现的?基于注解 java的注解是什么原理?(他想问的应该是动态代理的原理,讲了jdk动态代理和cglib的区别,略 jvm加载类的时候,啥时候创建的动态代理类?(针对不同的AOP方式,创建动态代理类的时机也是不同的;对于AspectJ这种编译时增强,其相当于直接修改了java代码,所以在jvm加载类的时候,就创建了增强的动态代理类;而jdk动态代理和cglib都是运行时增强,是在spring容器初始化之后,创建各个bean的时候,创建的这些动态代理类,注意,spring容器里的bean都是动态代理的类,而不是程序员写的代码对应的那个类 分布式锁的粒度是怎么样的?操作+被操作对象粒度,细粒度(Fine-grained) redis是单库?单节点?单集群?忘了他问的啥了..(CRM系统用的单redis集群;菜品系统用的多redis集群 多redis集群怎么协调状态?(无需协调状态,该系统是多租户的,不同租户使用各自独立的redis集群,互不影响(租户数量不多,现阶段也就3个)使用多集群时,对redis服务进行了封装,添加租户id作为route key,算是有一定侵入性的 分库分表怎么做的,有中间件支持吗?是否有侵入性?(公司的DBA做了分库分表的中间件,无需手动实现,无侵入性,正常写SQL(SQL里需要有分库分表的字段)即可 JVM 内存分哪几块,堆分为哪几块?GC怎么做的?(略 OOM什么时候产生的?(略 栈溢出什么时候产生的?(略 栈大小是1M,是啥意思,所有栈加起来1M吗?(给他详细讲了讲.. 元数据区是啥?(java8引入的新概念,作为方法区的实现,代替之前的永久带的实现 平衡二叉树了解吧?(了解 二叉树的先序中序后序了解吧?(了解 算法题:见上面那一行 |
|
|
华为二面 讲系统架构&你在里面承担什么职责 怎么处理安全问题,怎么防止命令注入?(参数校验 参数校验是自己实现,还是通过工具?(我说我们做后端服务,提供thrift接口,不涉及这个… XSS是什么,分哪三种?(不会 HTTP的返回码,2/3/4/5开头的分别都是啥意思 OOM什么场景出现?(堆内存全是被占用的对象,新对象申请不到空间了,即使回收了软引用的对象也不够了 top看到某个进程CPU过高怎么排查?(jstack看各个线程,有没有一直runnable的,怀疑死循环;看业务逻辑里,有没有对json解析等特别耗费CPU的场景 内存怎么分析?(jmap等命令 jmap命令里,shallow heap跟retained heap有什么区别?(跪了,不会 jdk7/8里,HashMap有什么改动?(答了8有链表与红黑树的转化;其实还有个头插变尾插 接口耗时异常,怀疑是redis有问题怎么排查?(我说先得确定到底是哪儿耗时,一方面可以加监控打点,从统计角度看各个方法的耗时,另一方面可以使用greys针对一次接口调用,看对应各个子方法的耗时详情 redis慢日志功能了解吗?(不了解 |
|
|
三面-部长面 自我介绍(做过哪些项目 |
|
|
华为-云计算
|
|
|
---|---|---|
java的集合有哪些 |
|
|
SAP
|
|
|
---|---|---|
一面 你大学导师是谁 js基本数据类型有哪些 未赋值的var变量,值是啥 英语自我介绍一下 |
|
|
二面 // 我日,记不太清了
|
|
|
联通研究院
|
|
|
---|---|---|
一面 讲项目 |
|
|
二面 ?? |
|
|
腾讯企点
|
|
|
---|---|---|
一面//todo |
|
|
二面//todo |
|
|
三面//todo |
|