疑点难点1.0
3.synchronized & ReentrantLock
在执行Thread.start()方法后,线程是不是马上运行
进程状态
6.Excutor Excutors ExcutorService
9.进程间通信+Socket 多线程之间的通信
10.ThreadLocal
11.Redis集群
12.一致性Hash
13.分布式锁
14.一致性算法
15.B树 B+树 红黑树
16.HTTPS
18.MySQL索引
1.InnoDB聚集索引 非聚集索引
聚集索引:B+树叶子节点存储数据是主键值和实际的记录数据。
非聚集索引:B+树叶子节点存储的是主键值和记录的物理地址指针,再根据地址找到记录数据。
2.为什么InnoDB表必须有主键,并且推荐使用整型的 自增主键?
答:B+树节点必须有索引构造整个表;B+树查找整数进行比较使用整数快并且节省存储空间,自增是为了:一个节点最大空间为16K,但存满了再往中间插入时会造成树深度增加,而自增是往后增加数字,不增加深度。
3.为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
4.联合索引的底层存储数据结构是什么样?
答:(自己想的)还是和以前单索引数据结构一样,只不过存入多个字段,比如(name,age),先比较name,再比较age的大小。
20.MySQL隔离级别实现原理系列文章--
MVVC+Next-key-locks
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).