经过一波密集面试, 终于拿到心仪的offer, 于这周入职。 终于下定决心离开厦门,来到了帝都。其实自己都说不清为啥, 就是凭着一腔热血,趁着年轻多见见世面。 这次远程+现场面试应该有10家,大小公司都有, 感觉除了头条都能拿到offer, 就是钱的区别。 除了头条面试变态, 其他公司套路差不多,包括滴滴,百度,链家,陌陌等。一些常用技术+简单数据结构/算法。我猜主要看上家公司背景吧,非小公司出来的技术不太差一般都会要。 我刚好属于不会吹的那种, 更好的做法是提前准备好说辞, 包括工作中遇到的哪些挑战, 自己做了哪些牛逼的事。哎,在我看来平时的工作也没啥挑战, 都能轻松完成。 其实仔细想想, 还是平时总结的不够, 时间长了就忘了。换位思考下, 如果说不出遇到的挑战, 面试官可能以为你做的事情比较边缘或简单,甚至怀疑你的技术。 总之就是平时做好总结, 面试时大胆的吹出来。 这里列出一些知识点,如果掌握了这些基本上除头条外的国内互联网公司都能搞定了。 头条的话感觉需要补充各种计算机基础知识(如操作系统, 网络等)和刷一遍leecode。另外剑指offer一定要过一遍!

Mysql

mysql事务隔离级别

https://tech.meituan.com/innodb-lock.html

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。我们的数据库锁,也是为了构建这些隔离级别存在的。 隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read) 未提交读(Read uncommitted) 可能 可能 可能 已提交读(Read committed) 不可能 可能 可能 可重复读(Repeatable read) 不可能 不可能 可能 可串行化(Serializable ) 不可能 不可能 不可能 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读) 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

锁机制

https://tech.meituan.com/innodb-lock.html mmvc+next-key lock 解决repeatable read 下的幻读问题

引擎 innodb, mysiam区别

主要是innodb支持事务, 行锁, 外键, mysiam不支持

主从复制机制

从库连接主库, 主库开binlog dump线程与从库的io线程连接, 从库io线程接受主库的binlog日志, 写到本地的relay log

从库sql线程读relay log, 执行相应的sql操作。

实践,扩容, 切库

ACID

原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。

索引

聚簇 btree 最左前缀

Redis

数据结构及实现

string hash list set sorted set

持久化

rdb aof

主从复制机制

  1. 如果设置了一个Slave,无论是第一次连接还是重连到Master,它都会发出一个SYNC命令;
  2. 当Master收到SYNC命令之后,会做两件事: a) Master执行BGSAVE,即在后台保存数据到磁盘(rdb快照文件); b) Master同时将新收到的写入和修改数据集的命令存入缓冲区(非查询类);
  3. 当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传送给Slave,而Slave则把内存清空后,加载该文件到内存中;
  4. 而Master也会把此前收集到缓冲区中的命令,通过Reids命令协议形式转发给Slave,Slave执行这些命令,实现和Master的同步;
  5. Master/Slave此后会不断通过异步方式进行命令的同步,达到最终数据的同步一致;
  6. 需要注意的是Master和Slave之间一旦发生重连都会引发全量同步操作。但在2.8之后版本,也可能是部分同步操作。

部分复制 2.8开始,当Master和Slave之间的连接断开之后,他们之间可以采用持续复制处理方式代替采用全量同步。 Master端为复制流维护一个内存缓冲区(in-memory backlog),记录最近发送的复制流命令;同时,Master和Slave之间都维护一个复制偏移量(replication offset)和当前Master服务器ID(Master run id)。当网络断开,Slave尝试重连时: a. 如果MasterID相同(即仍是断网前的Master服务器),并且从断开时到当前时刻的历史命令依然在Master的内存缓冲区中存在,则Master会将缺失的这段时间的所有命令发送给Slave执行,然后复制工作就可以继续执行了; b. 否则,依然需要全量复制操作;

Redis 2.8 的这个部分重同步特性会用到一个新增的 PSYNC 内部命令, 而 Redis 2.8 以前的旧版本只有 SYNC 命令, 不过, 只要从服务器是 Redis 2.8 或以上的版本, 它就会根据主服务器的版本来决定到底是使用 PSYNC 还是 SYNC :

如果主服务器是 Redis 2.8 或以上版本,那么从服务器使用 PSYNC 命令来进行同步。 如果主服务器是 Redis 2.8 之前的版本,那么从服务器使用 SYNC 命令来进行同步。

实践,扩容, 切库

扩容: 复制+双写

算法

  • 排序
  • 查找
  • 动态规划

Linux

*  进程线程区别
*  管道、共享内存、信号量

网络

* tcp三次握手
* HTTP协议

PHP

php7优化点

GC

生命周期