互联网八股文(持续更新)

希望大家看原文地址,后续会加入展开版

1. 幂等性10种解决方案 原文地址 幂等性解决方案 我备份的地址 备份连接

2.分布式事务六种解决方案 原文地址 知乎源  其他地址 CSDN源 (推荐)

        2pc  3pc  tcc  本地消息表  消息事务  最大努力通知

3.Linux NIO (注意不是JavaNIO)5种Linux IO

        阻塞IO    非阻塞IO    多路复用IO    信号IO    异步IO  epoll LT(如果不处理,下次还会通知) ET(只通知一次)

4.缓存与数据库数据一致性 6种解决方案 原文链接 缓存与数据库一致性解决方案

  1. 缓存直接设置过期时间 (缓存数据不敏感的最优解)
  2. 先更新数据库,再更新缓存 (绝对不可取的一种解决方案)
  3. 先删除缓存,再更新数据库
  4. 先更新数据库,再删除缓存
  5. 消息队列
  6. 专门程序 + 消息队列 (专门程序负责订阅binlog)

5.进程间通讯的7种方式 原文链接 进程间通讯  后续我想自己出一个本栏教程

命名管道FIFO  管道pipe  消息队列  共享内存(也叫共享存储)信号量   套接字(Socket)    信号

6.Reactor线程模型 3种模式  原文连接 Reactor线程模型

      单Reactor单线程模型   单Reactor多线程模型    多Reactor多线程模型

7.G1垃圾收集器有哪些空间  原文链接 G1垃圾收集器

  Eden Survivor Old Humongous  产生一个巨大的对象一个H区装不下时,触发Full GC

8.常见注册中心和区别  原文链接 常见注册中心

  CAP定理(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性)

  ZooKeeper(CP,主从)   Eureka(AP,平级)  Nacos(CP或AP,主从或平级) Consul(CP,主从) etcd

9.操作系统八股文篇  原文链接 操作系统的八股文自述(持续更新)

10.JVM 八股文 原文链接 JVM八股文

运行时数据区:方法区,堆;虚拟机栈,本地方法栈,程序计数器;前两个线程共有。

方法区里面包括运行时常量池。堆中会给每个线程划分出一个线程私有的空间,线程私有的堆空间装不下时,用cas方法去申请内存空间。

栈帧:局部变量表,操作数栈,动态链接,方法返回地址。

java对象内存分布

垃圾收集器

12.分布式锁四种方式 原文链接 分布式锁

          数据库   Redis  Memcaced  ZooKeeper

13.http1.0   1.1   2.0区别

      1.0 每次都得三次握手 四次挥手;
      1.1 增加了 1)长连接(keep-alive)  2) 断点续传(文件分段传输) 3) 增加了24个错误状态码 4)缓存处理,服务器端发现请求是同一个人的相同请求,并且自己没有更新内容的话,告诉客户端直接使用缓存。5)Host头处理,每次请求必须加上Host,因为IP地址不能唯一定位一个主机,可能会有一个主机上多个虚拟机提供服务。
      2.0 增加了1)多路复用,一次三次握手 可以并发处理多个请求。2)头部压缩,不变的一些参数 cookie UserAgent 通过gzip压缩。3)服务器可以主动推送 (websocket)

14.redis 数据结构 原文 redis5种数据结构

  1. string =》 int、raw或者embstr;2.  list=》quickList(linkedlist与ziplist的结合体) ziplist(1.所有字符串长度都小于64字节.2.元素数量小于512)  linkedlist  3.hash=> ziplist hashtable  4.set=> intset(全是整数) hashtable(value为null)  5.zset  ziplist(1所有元素长度小于64字节;2元素个数小于128个)  skiplist 

15. jdk、cglib动态代理的区别

jdk动态代理是由java内部的反射机制生成一个实现代理接口的匿名类,被代理的类必须要实现一个接口,如果某个类没有实现接口则不能生成代理对象,实际使用中会有一些局限性

cglib动态代理底层是借助asm来实现的,加载实际类的.class文件,修改其字节码生成子类来处理,比java反射效率要高一些,不过生成子类的方式也带来小问题:目标类不能声明成final,因为final类不能被继承,无法生成代理;目标方法也不能声明成final,final方法不能被重写,无法得到处理

16. ACID A原子性要么全部成功,要么全部失败。C一致性 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。I 隔离性  多个事务提交应互不干扰 D 持久性 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

17. 不可重复读和幻读,都是读已提交,区别是不可重复读是update/delete 幻读是insert

18. 对称加密算法 DES、AES-GCM、ChaCha20-Poly1305 。非对称加密算法:

RSA、DSA、ECDSA、 DH、ECDHE。   哈希算法 MD5、SHA-1、SHA-2、SHA-256

19. https过程:1) TCP三次握手之后, 客户端将自己本地支持的加密套件发给服务端,加密套件包括(1)散列算法列表 (2) 对称加密算法列表 (3)非对称加密算法列表。【本步是明文传输】 2),服务端在收到加密套件后,选择每个算法中各选出一个,并将自己的公钥证书同时发送给客户端。【本步为明文传输】3)客户端收到证书之后,验证证书,并且根据服务端发送回信息中的【对称加密算法】生成一个对称加密秘钥,并用公钥证书中的公钥对这个对称加密秘钥进行加密。4)服务端收到后,用私钥解密得到客户端的对称加密秘钥,之后双方通过对称加密进行双向传输。CA证书包含:公钥用户信息,公钥,权威机构签名,有效期。   CA证书验证过程:1)在证书中找到这个证书的颁发者,将证书的公钥发给这个颁发者去验证。2)如果这个证书的颁发者,还有父颁发者,在拿着当前证书的颁发者去父颁发者那里去验证。3)递归一直找到根证书颁发者,这个根证书颁发者是它自己,至此为止递归验证结束。

20. 类加载机制 加载 链接 初始化,原文链接 类加载机制 

加载:通过包名加类名 找到这个类的.class文件的二进制字节流(ClassLoader),加载二进制数据到内存 —> 映射成jvm能识别的结构 —> 在内存中生成class文件

链接:1.验证,确保class能加载到虚拟机中。2.准备,为静态字段分配内存,并设置初始值。3.解析 符号引用变为直接引用。

初始化: 执行init() jvm会保证父类的init先执行,静态字段设置真实值。

四种类加载器,引导类加载器(BootStrap,也是顶层类加载器rt.jar) -》拓展类加载器(Extension)-》系统类加载器(App)-》用户自定义类加载器。

21.零拷贝 零拷贝

  1.传统拷贝 read write系统调用。2.mmap + write 只减少了一次复制 3. sendfile 减少了两次 

4.sendfile + DMA gather copy (DMA直接读到内核缓冲区之后,通过偏移量直接让Socket缓冲区认为这是自己区域的数据,直接发送到网卡上)。

22.产生死锁的四个条件    产生死锁的四个条件
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可强行占有:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

处理死锁的基本方法

*死锁预防:通过设置某些限制条件,去破坏死锁的四个条件中的一个或几个条件,来预防发生死锁。但由于所施加的限制条件往往太严格,因而导致系统资源利用率和系统吞吐量降低。

*死锁避免:允许前三个必要条件,但通过明智的选择,确保永远不会到达死锁点,因此死锁避免比死锁预防允许更多的并发。

*死锁检测:不须实现采取任何限制性措施,而是允许系统在运行过程发生死锁,但可通过系统设置的检测机构及时检测出死锁的发生,并精确地确定于死锁相关的进程和资源,然后采取适当的措施,从系统中将已发生的死锁清除掉。

*死锁解除:与死锁检测相配套的一种措施。当检测到系统中已发生死锁,需将进程从死锁状态中解脱出来。常用方法:撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程。死锁检测盒解除有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

23. 索引创建原则

24. mysql锁: 记录锁,间隙锁,临键锁

记录锁:唯一索引或主键索引等值查询,并且查询到了的时候会将该记录锁住。

间隙锁:等值或范围查询,记录不存在,锁住包含查询区间的最小区间。

临键锁:范围查询,能查到至少一个结果。锁住最小区间加上记录,等价于记录锁加间隙锁。

25.三次握手四次挥手

TCP拥塞控制 滑动窗  慢开始 拥塞避免(慢开始的阈值之后就线性)| 快重传(收到相同ack里面推出丢失的包重传)和快速回复(直接切换成慢开始,如果就是慢开始不用动)

26. 进程地址空间 进程地址空间详解(华为云)
1)程序段Text  2) 初始化过的数据 Data  3)未初始化过的数据 BSS 4) 栈 Stack 5)堆

27. 索引建立原则

1) 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

2)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

3)尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录

4)索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

6)定义有外键的数据列一定要建立索引。

7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。

8)对于定义为text、image和bit的数据类型的列不要建立索引。

9)对于经常存取的列避免建立索引

28.

为什么说B+树比B树更适合数据库索引?

1、 B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值