面试之前觉得都挺好的,但是面试过程中才发现有些东西还是记得似是而非。当然,究其根本是因为确实没理解透彻,但是总结归类才可以更好的找到工作。我会持续更新这篇文章,以此来整理我面试中遇到的题目。
一、数据库类(以下可能会以不同的形式问,比如如何选择存储引擎等):
1. mysql 存储引擎:MyIsam 不支持事务,不支持外键,锁是表级锁,适用于并发量不高,并且读远大于写的场景;InnoDb 支持ACID事务性,支持外键,锁可以精确到行锁,因此支持高并发量。
2. count(1) 与 count(*) 没有区别,但是 count(name)这样非主键或非唯一约束的count只统计非null行,因此count(1) >= count(name);(主键或唯一约束要求不能为null)
3. 索引分为聚集索引和非聚集索引(也叫辅助索引),聚集索引B+树叶子节点存储整行的数据,非聚集索引叶子结点存储聚集索引的key。因此select 要尽可能只引用索引上的列,避免回表查询。
MyIsam索引存储结构与InnoDb索引存储结构的不同点是:myisam主键虽然也是B+树实现的索引结构,但是因为其文件分为索引文件和数据文件,因此索引的子节点存储的是数据文件的指针;但是innodb的主键索引叶子结点存储的是整行的数据,key和数据聚集在一起,因此叫做 聚簇索引。
4. 主键的选择应该尽可能的短,尽可能是单调自增的(如果不是,数据的频繁插入可能导致树的频繁调整和数据页的频繁分裂)
分布式 :
1. CAP理论,2PC,3PC和一致性分类(强一致性,弱一致性,最终一致性),如何根据不同的要求设计不同一致性的系统
2. 分布式一致性(其实和1 的问题是一类),一致性哈希算法,一致性哈希的要求(均衡性:哈希尽可能均匀分不到地址空间,单调性:地址空间增大或减少时,哈希应该能够自动映射到增大或减少的空间,分散性:同一个key应该在任何时候被分配到同一个缓冲区中,负载)
3. 服务治理(注册,治理,发现,调用,负载均衡,降级等)
网络协议:
1. http 1.0, 1.1 和 2.0的区别:
1.0 和 1.1 :1.0 一个http请求创建一个tcp链接,响应结束连接就断掉,因此是无状态的;1.1在同一个tcp连接上可以进行多次的http请求,同时请求和响应是流水线式的,增加了cookie可以保持状态,请求和响应头增加了 host 字段(必须传该字段,为了支持一个ip多个host的情况),增加了 100 状态码用来进行数据批量传输,1.1 增加了更过对缓存的策略,比如 if-None-Match 等
1.1 和2.0 :1.1依然是基于文本的传输,2.0基于二进制传输;2.0对header进行了压缩,避免了大量重复数据发送;2.0支持服务端的push功能
缓存:
1. redis 集群的方式和特点(单点,主从,哨兵和 cluster),redis为什么这么快(基于内存和大量连接的多路复用减少线程切换消耗),数据的两种持久化方式(RDB和AOF), 缓存穿透,雪崩。
io:
1.linux下的io模型 :同步和异步,阻塞和非阻塞;5种io模型:阻塞式io,非阻塞式io,多路复用(select, poll, epoll),信号驱动io(SIGIO),异步io(POSIX的aio_开头的函数)(参考文章:https://blog.csdn.net/z_ryan/article/details/80873449)
多线程:
1. synchronized关键字的实现原理,锁膨胀,AQS框架和几个实现(可重入锁)
2. 线程池核心参数(coreSize, maxSize, blockingQueue, 拒绝策略)