1.java
1.1 hash算法
1.1.1 除余法
除余法就是用关键码x除以M(往往取散列表长度),并取余数作为散列地址。
1.1.2 乘余取整法
先让关键码key乘上一个常数A(O<A<1),提取乘积的小数部分。然后,再用整数n乘以这个值,对结果向下取整,把它做为散列的地址。
1.1.3 平方取中法
由于整数相除的运行速度通常比相乘要慢,所以有意识地避免使用除余法运算可以提高散列算法的运行时间。平方取中法的具体实现是:先通过求关键码的平方值,从而扩大相近数的差别,然后根据表长度取中间的几位数(往往取二进制的比特位)作为散列函数值。因为一个乘积的中间几位数与乘数的每一数位都相关,所以由此产生的散列地址较为均匀。
1.2冲突解决办法
1.2.1 链表法
1.2.2 开放地址法
-
线性探测法将散列表看成是一个环形表,若在基地址d(即h(K)=d)发生冲突,则依次探查下述地址单元:d+1,d+2,M-1,0,1,d-1直到找到一个空闲地址或查找到关键码为key的结点为止。
-
二次探查法
生成的后继散列地址不是连续的,而是跳跃式的,以便为后续数据元素留下空间从而减少聚集。二次探查法的探查序列依次为:12,-12,22,-22,等,也就是说,发生冲突时,将同义词来回散列在第一个地址的两端。 -
随机探查法
-
双散列法
https://wwwjianshu.com/p/f9239c9377c5
1.3 如何让线程在5秒钟内获取到锁
- ·对程序进行限流,降级
- ·对线程根据等待时间做优先级升级,优先级越高,越先获取锁
- ·对业务代码做优化
2.Spring
2.1 spring的注解原理
AnnotationInvocationHandler它继承自InvocationHandler,会使用jdk的动态代理生成数据。
判断注解是否存在
- 注解通过反射获取,通过 Class对象的 isAnnotationPresent()方法判断它是否应用了某个注解
- 通过 getAnnotation()方法来获取 Annotation 对象实例
@TestAnnotation("defaultValue")
public class Test{
public static void main(String[] args){
// 注解通过反射获取,通过Class 对象的isAnnotationPresent()方法判断
它是否应用了某个注解
boolean hasAnnotation=Test.class.isAnnotationPresent(TestAnnotation.class);if(hasAnnotation){//通过getAnnotation()方法来获取 Annotation 对象实例Tes tAnnotation testAnnotation=Test.Class.getAnnotation(TestAnnotation.class);System.out.println("id:"+ testAnnotation.id());System.out.println("msg:" + testAnnotation.msg());}}
}
2.2 spring的设计模式
https://blog.csdn.net/chao821/article/details/92400186
https://blog.csdn.net/w05980598/article/details/79363046
3.dubbo
3.1 dubbo的调用链路
如何从consumer调用到provider,provider又是如何处理信息的
3.2 dubbo和http的区别
dubbo是一个分布式的服务请求框架,改用provider和consumer模式进行服务。consumer端无需关注provider端如何实现,只需在注册中心订阅即可到相应服务器请求服务,这样就实现了高性能和透明化。
-
协议层区别
1 HTTP,HTTPS 使用的是应用层协议 应用层协议:定义了用于在网络中进行通信和传输数据的接口2 DUBBO接口使用的是TCP/IP是传输层协议 传输层协议:管理着网络中的端到端的数据传输;因此要比 HTTP协议快
-
socket层的区别
1 dubbo默认使用socket长连接,即首次访问建立连接以后,后续网络请求使用相同的网络通道2 http1.1协议默认使用短连接,每次请求均需要进行三次握手,而http2.0协议开始将默认socket连接改为了长连接
3.3dubbo请求体是啥?
1.消息头
magic:类似java字节码文件里的魔数,用来判断是不是dubbo协议的数据包。魔数是常量
0xdabb
flag:标志位,一共8个地址位。低四位用来表示消息体数据用的序列化工具的类型(默认
hessian),高四位中,第一位为1表示是request请求,第二位为1表示双向传输(即有返回
response),第三位为1表示是心跳ping事件。
status:状态位,设置请求响应状态,dubbo定义了一些响应的类型。具体类型见
com.alibaba.dubbo.remoting exchange.Response
invoke id:消息id, long类型。每一个请求的唯一识别d(由于采用异步通讯的方式,用来把请
求request和返回的response对应上)
body length:消息体 body长度,int类型,即记录Body Content有多少个字节。
2.消息体
实现源码在DubboCodec.encodeRequestData(Channel channel,ObjectOutput out,Object
data):
1、dubbo版本号
2、invoke的路径
3、invoke的provider端暴露的服务的版本号
4、调用的方法名称
5、参数类型描述符
6、遍历请求参数值并编码
7、dubbo请求的attachments
4.kafka
4.1简单介绍下kafka
4.2分区及分区副本,如何保证一致性的
4.3 kafka如何提高吞吐量的?和其他MO对比
5.线上遇到的问题
5.1CPU占用较高
5.2内存占用最高
===========================
1 .redis和zookeeper分布式锁应用场景的区别
2 .线程池的种类
3 .几个线程同时去做某种事情(强调同时)
4 .二进制为什么高
5 .IO流类别 ,以及随机读的方式
6 .dubbo的熔断