疑点难点1.0

1.HashMap详解

3.synchronized & ReentrantLock   

  在执行Thread.start()方法后,线程是不是马上运行

  进程状态  

4.synchronized码源分析

5.ConcurreHashMap

6.Excutor Excutors ExcutorService

7.Linux查找哪个线程使用CPU时长最长?

8.Redis五种数据结构

9.进程间通信+Socket   多线程之间的通信

10.ThreadLocal

11.Redis集群

12.一致性Hash

13.分布式锁

 

14.一致性算法

15.B树 B+树 红黑树

16.HTTPS

17.Session Cookie

18.MySQL索引

  1.InnoDB聚集索引 非聚集索引

  聚集索引:B+树叶子节点存储数据是主键值和实际的记录数据。

  非聚集索引:B+树叶子节点存储的是主键值和记录的物理地址指针,再根据地址找到记录数据。

  2.为什么InnoDB表必须有主键,并且推荐使用整型自增主键?

  答:B+树节点必须有索引构造整个表;B+树查找整数进行比较使用整数快并且节省存储空间,自增是为了:一个节点最大空间为16K,但存满了再往中间插入时会造成树深度增加,而自增是往后增加数字,不增加深度。

  3.为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

  4.联合索引的底层存储数据结构是什么样?

  答:(自己想的)还是和以前单索引数据结构一样,只不过存入多个字段,比如(name,age),先比较name,再比较age的大小。

19.缓存穿透、缓存击穿、缓存雪崩     

 解决方案

20.MySQL隔离级别实现原理系列文章--

  MVVC+Next-key-locks

21.Mysql高可用、高并发访问MySQL

22.Linux操作命令

23.Java基础---集合

24.线程池种类

newCachedThreadPool:创建一个可缓存的线程池。核心数是0,最大数是 Integer.MAX_VALUE。线程池中的线程可进行缓存重复利用和回收(回收默认时间为1分钟)

newFixedThreadPool:创建固定大小的线程池。

newSingleThreadExecutor::创建一个使用单个 worker 线程的 Executor,之后提交的线程活动将会排在队列中以此执行。

newScheduleThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

newSingleThreadScheduledExecutor:创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

 

 核心参数:

public ThreadPoolExecutor(
  int corePoolSize,           //核心池的大小,核心线程一直会存在,即使没有任务
  int maximumPoolSize,             //池中允许的最大线程数,这个参数表示了线程池中最多能创建的线程数量
  long keepAliveTime,         //当线程数大于corePoolSize时,终止前多余的空闲线程等待新任务的最长时间
  TimeUnit unit,            //keepAliveTime时间单位
  BlockingQueue<Runnable> workQueue, //存储还没来得及执行的任务
  ThreadFactory threadFactory,    //执行程序创建新线程时使用的工厂
  RejectedExecutionHandler handler   //由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序
/**
corePoolSize与maximumPoolSize举例理解

1、池中线程数小于corePoolSize,新任务都不排队而是直接添加新线程

2、池中线程数大于等于corePoolSize,workQueue未满,首选将新任务加入workQueue而不是添加新线程

3、池中线程数大于等于corePoolSize,workQueue已满,但是线程数小于maximumPoolSize,添加新的线程来处理被添加的任务

4、池中线程数大于大于corePoolSize,workQueue已满,并且线程数大于等于maximumPoolSize,新任务被拒绝,使用handler处理被拒绝的任务*/

 拒绝策略:当任务不断过来,而系统处理不过来。

AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。
CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。
DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

25.AQS

26.MySQL字符串索引优化

27.消息队列问题解决

一、消息丢失
RabbitMQ
1.生产者丢失数据(例如网络原因)
  事务:如果RabbitMQ没有接收到消息,返回异常,回滚事务。但是降低吞吐量,消耗性能。
  confirm模式:生产者开启congirm模式之后,每次的消息都会分配一个唯一ID,Rabbit如果接收成功,则返回一个ack消息,否则返回一个nack消息。
2.RabbitMQ丢失数据
  RabbitMQ持久化queue元数据 + 将消息设置为持久化。
  此方法可以和confirm机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者ack。
3.消费者丢失数据(消费到了还没处理,比如进程挂了)   使用ack机制,处理完之后在程序里返回ack给RabbitMQ,RabbitMQ会把这个消息分配给其他consumer处理,消息不会丢。 二、消息失序   一个queue多个consumer场景
  解决:一个queue对应一个consumer 三、消息过期或者延时   设置过期时间TTL,但是会导致大量数据未处理就被清理掉。此时使用批量重导,服务器压力小的时候人工重导。

四、大量消息积压在mq为解决   临时紧急扩容。先修复consumer问题,确保其回复消费速度,然后加机器部署consumer,加queue数量。

 

28.域名解析DNS详细过程

29.NAT、Proxy、route

三者都是局域网接入Internet的方式
NAT:网络地址转换,工作在网络层
Proxy:代理服务器,工作在应用层
Route:路由
    NAT和Proxy都用于内网和外网通信的一个桥梁,节约IP地址资源。
    NAT相当于一个报文转发的中转站,只有一个连接。不会改变报文的BODY内容,不过公网只识别NAT节点的ip,所以报文在NAT中转站会被做一个SNAT,修改源地址和端口,对外体现公网识别的源端地址。我们平时家用上网的方式就是这个NAT方式。
    proxy代理模式相当于用户与服务器之前的代理人的角色,是两组CS模式的连接。即用户(客户端)与代理服务器(服务器)的CS模式、代理服务器(客户端)与互联网(服务器)的CS模式。
    NAT用于转发内网和公网之间的报文发送, 修改源地址。Route用于转发公网与公网之间的报文,只转发不会修改报文。

 

30.IO多路复用

文件描述符 fd
一、select:(监听文件描述符的数据结构,当有数据时,轮询遍历整个数据结构找到有数据的文件描述符进行读取操作)
  优点:将fd复制到内核态操作效率提高
  缺点:
    1.单个进程可监视的fd数量被限制,即能监听端口的大小有限(bigmap)。32位机默认是1024个。64位机默认是2048.
    2.fd置位不可重用
    3.复制fd到内核态任然需要很大开销
    4.每次文件描述符有数据时,不知道是哪个或者哪几个,需要遍历整个数据结构,即O(n)

二、poll(和select差不多,但是采用链表存储文件描述符,没有大小限制)
    优点:大小没有限制、pollfds数据结构可重用(进行读取操作之前short revents恢复为0)
    缺点:复制到内核态需要开销;需要轮询遍历操作O(n);
三、epoll(当有数据来时,将有数据的fd排到前面,epoll_wait方法返回有数据的fd个数,然后遍历这几个有数据的fd - O(1))
    内核态和用户态共享文件描述符的存储结构,不用再复制。
    并且时间复杂度为O(1).

 

posted @ 2020-03-08 19:37  Qmillet  阅读(190)  评论(0编辑  收藏  举报