2019-3今日头条一轮游面经

在广告行业相关公司做研发,猎头帮忙投了头条的广告业务部门,面试下来,感觉面试官应该在投放相关的业务线。我虽然接触过投放相关的业务,然而并没有和面试官聊很high。

原因如下:首先,投放业务线并没有在我们组,知道的非常浅显;其次,头条的量级还是要比小厂大很多的,所有很多问题没有遇到过。然而面试官此时已经对你有了一个期待,这就很尴尬了。

所以业务不相关不见得是坏事。

业务相关问题:

Q:redis更新id对应的tid的时候,如何可以快速更新?

A:如果id对应的tid没有更新,则不需要刷新该id对应的值。有新增id的时候可以放在第二个redis机群里,(不过这样就会请求两次),有删改则只能更新,暂时没有想到更好的方法。

(这块是按照自己对投放业务理解说的,我并没有直接接触过投放业务,求解答。)

Q: 一次曝光来的时候,如何知道这个id应该被曝光的所有广告列表。

A:根据id应该能够查找所有的标签tids,每个活动约定的标签是一定的,则可以通过tid确定对应的广告。

Q:那题tid到广告这个过程呢?

A:可以通过内存型数据库,来存放这种对应关系。

Q: 那如果非常大呢?

A: 首先,活动是有期限的,内存型数据库可以只存储活动期间的对应关系。还有部分活动是通投,默认的就会有可投放列表。当响应时间剩余不多,可以优先返回默认列表。

后来问了一下头条的同学: Ad Serving Using a Compact Allocation Plan

(这块答的感觉也不太到位, 后来回来想,或许可以借助ES?然而当时已经完全忘了。)

 

纯面试:

Q:说一下多线程下同步的方法?

A:信号量,互斥量,以及各个线程对中断事件的响应(这里想说事件, 忘词了)。

Q: 见过一些线程拥有自己的资源么?

A:(没有反应过来,面试官这里给了临界区的提示。)

Q:那怎么实现线程安全呢?

A:发布安全的对象。Final对象和无状态类一定是线程安全的。此外的变量多线程下需要采取必要的同步机制。或者栈封闭、线程封闭。

Q: 栈封闭?

A:对。《java并发编程实战》第四章有写。这些情况下是线程安全的。

(这里我需要疯狂的吐槽自己,放下没有get面试官的意图。 面试官应该是还在问题1那边延申,然而则认为是一个新的问题)

Q:那你说下ThreadLocal吧。

A:threadlocal是线程独有的,在Thread类下有一个map作为成员,key为每个Thread,value则是多个threadLocald的变量。当要使用时,以当前线程作为key,获取对应的变量。

Q: 那线程池怎么办呢?一个线程一直存在?

A: (卡顿)应该考虑线程结束时释放必要的threadlocal变量。

Q:为什么要用线程池,为什么不自己写一个?

A:(你为什么要问我这么感觉有坑的问题)线程池提供了各种参数,我们可以根据业务场景来设置对应的参数。比如,当更多的线程被资源限制时,可以使用线程池的队列在存储任务,自己单纯写线程启动的话,可能这些状况下会有问题。

Q: 为什么要用spring。

A: (又问我这么听起来就知道你接下来没完的问题。)spring是java常用的开源框架,可以提升我们的开发效率。(停顿,想知道面试官想问什么)

Q:spring基础的知道么,IOC,AOP之类的?

A:嗯,知道的。IOC既控制反转,也有书上建议使用DI依赖注入来说明这件事。它。。。

Aop则是面向切点的编程。可以定义一个切点,在它的前后做一些共同的操作。比如打个日志什么的。

Q: 为啥不直接打?

A: (喵喵喵?)可能有一些操作是通用的,AOP通过定义切点,可以是我们不需要反复写相同的代码。比如打印个方法开始时间,结束时间之类的。

Q: 你说你们有微服务是吧?那服务GG了怎么办?

A: 您是想问熔断那方面么?这个我目前的工作只涉及了服务发现和网关配置。熔断那部分我理解是在整个服务GG时,给出一个处理。我还没有碰到过这种情况,基本每个服务都有多个实例。服务发现和注册会通过健康检查检查各个实例的心跳。只要有一个实例存活,服务注册和服务发现会给出相应的策略,还没有接触到熔断那一块的知识。

Q: 那你说一下spring cloud都有哪些模块?

A: 服务发现,网关gateway,熔断,配置中心等。

Q: 你的意思是你们还没有完全建好是么?

A:对,正在逐步学习中。

Q: 那你说一些ZK,ERUKA之类的区别之类的?

A:  (这里已经有点丧了)都是分布式的框架。分布式需要面临CAP的问题。

Q: 说下CAP。

A:  一致性。。。(一致性、可用性、分区容错性)

Q: 说下HashMap的实现。

A:(我爱基础,然并卵)一个object的数组,采用链地址法,被分进同一个桶内的元素会形成链表。Jdk8后,链表长度超过一个常量(记得好像是8)是,会变成一棵树。

Q: 扩容会发生什么?

A:首先扩容数组会变成原来的两倍。

Q: 为什么是两倍?

A: 数组大小采用位运算,一定是2的x次幂。然后分为两部分,原来的低位部分和新增的高位部分。逐个看各个桶的哈希值,在新通仍处于低位的桶可以直接移动,高位则需要再次put。

Q: 扩容会出现什么性能问题?

A:高位的元素还是需要重新put,这个过程中有性能消耗。hashMap有一个影响因子,可以通过调整这个值,来调整resize的频率。(这个题我有点没get到面试官想问什么。后来和同学分析了一下,应该是OOM)

Q:知道sql注入么?

A:知道。一般会根据业务场景拼接sql语句。有些该填写参数的地方,填写了sql语句,使得最终生成sql语句执行了预期以外的语义。

Q: 为什么orm框架可以防止sql注入?

A:mybatis中使用#{arg},将被包含在‘‘字符串内,从而保证该部分即使包含sql关键字,也不会作为sql执行。

Q: 问点数据库相关的吧。Mysql哪些存储引擎?

A: InnoDb, myisam, memory。InnoDB是mysql目前的默认存储引擎,聚簇索引,有行级锁。Myisam不支持行级锁,查找较快,然而增改致命。

Q: 如何高性能使用mysql

A: (购买和阅读高性能mysql) 在表设计合理的情况下,建立合适的索引。

Q: innoDB索引底层什么样?

A:B+树和类哈希索引的集合。B+树同时有父子节点和前后续节点,查找起来更快。

Q: 那节点的值是什么?

A: (—喵喵—)。不知道,猜测应该包含主键值。

(高性能Mysql。P166, 包含主键值、事务ID、用于事务和MVCC的回归指针以及剩余列)

Q:那如何简历多列索引?

A: 符合左侧优先原则。

Q: 那假设有性别和课程号,谁在前谁在后?

A: 性别吧,性别只有两个值,在前能好的筛选?(不确定了已经。需要再查一些资料)

手写代码:

1-n个数,找出按照字典序排序的第K个数。

思路1:最坏直接当成字符串处理,排序,取K

思路2: 重写compare方法,快排,找到K,

思路3: (玩脱)找到小于等于n的下一个字典序数。

写头两个思路妥妥的,嘴*说了三个,不作不*。时间原因没写完。

 

一个超大的文件,每一行都是Timestamp:content,时间有序,找指定时间范围的content。

  1. 让我写个MR。
  2. 行号中序

你可能感兴趣的:(笔试面试经验,java,数据库)