4.10 面经补充

orm原理

对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术。

       简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。

线程池有几种与线程池参数

https://juejin.im/post/5d1882b1f265da1ba84aa676

servelet生命周期

Servlet程序运行过程:(init()---->service()----->destroy())

  Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
  ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
  ②装载并创建该Servlet的一个实例对象,调用Servlet实例对象的init()方法。
  ③创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
  ④处理后返回给客户端
  ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

红黑树如何优化二叉树(变色+左旋右旋)

1.根节点是黑色
2.叶子节点是黑色
3.节点非黑即红
4.红节点的子节点是黑色
5.从根节点到叶子节点的黑色节点数目相同

  • 红黑树的查询性能略微逊色于AVL树,因为他比avl树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多多一次比较,但是,红黑树在插入和删除上完爆avl树,avl树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于avl树为了维持平衡的开销要小得多
  • 相比于BST,因为红黑树可以能确保树的最长路径不大于两倍的最短路径的长度

一亿个数找10最大的,最大堆的理解

treemap的底层  红黑树

hashmap系的扩容如何实现    

hashmap:创建2倍长度的新数组 再hash填入,与运算 index = HashCode(key)% Length jdk1.7

                   index = HashCode(key) & (Length - 1) jdk1.8   

 1.7头插法并发问题

1.8尾插解决倒置问题,仍有并发问题

ConcurrentHashMap(值与next被volatile修饰):1.7对segment加锁

                       1.8对桶加锁

进程间的通信方式

(1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有父子,兄弟关系的进程间使用。

(2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。

(3)信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。

(4)消息队列(message queue):消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。

(5)共享内存(shared memory):共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。需要使用信号量用来同步对共享存储的访问。

(6)套接字(socket):与其它通信机制不同的是,它可用于不同机器间的进程通信。

线程间通信:

1、锁机制

     1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。

     1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥。

  **1.3 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

2、信号量机制:包括无名线程信号量与有名线程信号量

协程本质上协程就是用户空间下的线程。

完全二叉树:可以最后一层不满,但必须靠左!

b树与b+树的区别

B 树:所有叶子节点都在同一层,m个子节点,m-1个数据

B+树:

  1. 数据和子树相同(每个父节点数据都出现在子节点中,是其最大元素)
  2. 非叶子节点仅用作索引,它的数据和子节点有重复元素
  3. 叶子节点用指针连在一起

 区别:

  1. 非叶子节点没有数据,同样大小磁盘页可以容纳更多,IO 次数更少
  2. 每次都需要查询到叶子节点,查询性能稳定
  3. 叶子节点形成有序链表,范围查询方便

threadlocal的作用:

ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景

缓存穿透,缓存雪崩,见缓存问题随笔

缓存穿透

概念

访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

解决方案

  1. 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
  2. 访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。

缓存雪崩

概念

大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。

解决方案

可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。

缓存击穿

概念

一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决方案

在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。

域名查询的请求过程

数据库调优的基本方法与步骤

一、SQL语句优化

1、通过慢查询日志发现有效率问题的SQL

2、慢查询日志内容分析

慢查询日志主要分为5部分,第一部分是慢查询时间,第二部分是慢查询的来源主机和用户,第三部分是查询的执行时间、锁定时间、发送的行数、扫描的行数。最后是时间戳形式记录的命令以及该命令的执行的时间戳。

3、通过explain查看SQL的执行计划

具体的分析过程可以参考这里,里面的例子描述的很清晰。

二、索引优化

1、选择索引

(1)选择合适的索引列,选择在where,group by,order by,on从句中出现的列作为索引项,对于离散度不大的列没有必要创建索引。

(2)索引字段越小越好(因为数据库的存储单位是页,一页中能存下的数据越多越好 )

2、避免在索引上计算

三、数据表结构优化

1、选择合适的数据类型
(1)使用可存下数据的最小的数据类型。

(2)使用简单地数据类型,int要比varchar类型在mysql处理上更简单。

(3)尽可能使用not null

单例模式https://blog.csdn.net/Yeomer/article/details/80018957

消费者生产者模式

观察模式

根节点是什么

  • 方法区中类静态属性引用的对象
  •   方法区中常量引用的对象

tcp如何保证连接的唯一性:本地IP,本地端口,远程IP,远程端口。

滑动窗口作用:使其可靠,流量控制

close-wait(让服务器端发送还未传送完毕的数据)与time-wait状态,time-wait两倍时间原因

确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

可见性的实现方式 synchronized与volatile

GET与POST:

GET方法:url编码,不安全,长度有限制,可缓存

页表?

布隆过滤器

布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

LINUX指令:查看负载:w

java内存泄漏问题:可达但无用

大型网站架构图

 http:

请求头:编码格式,语音,压缩格式

相应头:编码格式,语音,压缩格式

sql优化相关  :查询语句,索引,表结构

  • Spring的IOC/AOP的实现
  • 动态代理的实现方式
  • Spring如何解决循环依赖(三级缓存)
  • Spring的后置处理器
  • Spring的@Transactional如何实现的?
  • Spring的事务传播级别
  • BeanFactory和ApplicationContext的联系和区别
  • 高并发系统的限流如何实现?
  • 高并发秒杀系统的设计
  • 负载均衡如何设计?
原文地址:https://www.cnblogs.com/lvoooop/p/12675666.html