复习总结 2023.7.2

一、如何理解springMVC?

SpringMVC是spring framework生态里的一个模块,它是在Servlet的基础上构建并且使用了MVC模式设计的一个Web框架,主要目的是为了简化传统的Servlet+Jsp模式下的Web开发方式。SpringMVC同时对Java Web中的MVC模式进行了扩展和增强:
1、将传统的Controller拆分为了前端控制器(DispatcherServlet)和后端控制器(Controller)
2、将Model模型拆分成业务层Service和数据访问层Repository
3、在视图层支持不同的视图:freemark、velocity、jsp等等
所以SpringMVC天生就是为MVC设计的,在开发MVC的时候会更加灵活。

二、ReentrantLook如何实现公平锁和非公平锁的?

AQS:Abstract Queue Synchronized,抽象队列同步器
1、公平锁:竞争锁资源的线程严格按照请求的顺序来分配锁,会先判断AQS里是否有等待线程,如果已经有线程在等待,那么就加入到队列的尾部进行等待。
2、非公平锁:竞争锁的线程允许插队来抢占资源,不管AQS里面是否有等待线程,它都会尝试去抢占锁资源,如果抢占不到,就再去加入到AQS中等待。在ReentrantLook内部默认使用了非公平锁的机制来实现锁的竞争,并且内部使用了AQS实现资源的竞争,没有竞争到锁资源的线程会加入到AQS同步队列中,该队列是一个FIFO的一个双向链表。
使用非公平锁的策略的好处在于:当前线程在上一个线程释放锁的临界点就抢占到了锁资源,提高了锁竞争的效率

三、Mysql为什么使用B+树作为数据结构?

常规的数据库引擎都是采用B树或者是B+树来实现索引的存储。B树是一种多路平衡查找树,采用这种数据结构来存储大量数据的情况下,它的整体高度相比二叉树来说会矮很多。对于数据库来说所有的数据都是存储在磁盘上的,但是磁盘的IO效率是很低的,而树的高度能够决定磁盘的IO的一个次数,磁盘IO次数越少,对性能的提升就越大。
但在Mysql的InnoDB存储引擎中,采用的是一种增强的B树结构,也就是用B+树来作为引擎和数据的一个存储结构。相较于B树,B+树做了几个方面的优化:
1、B+树的所有数据都存储在叶子节点上,非叶子节点只存储索引
2、叶子节点中的数据使用双向链表的方式进行关联
所以使用B+树的原因有:
1、B+树的非叶子节点不存储数据,所以每一层存储的索引数量就会增加,就意味着在高度相同的情况下B+树存储的索引量就更大,使磁盘IO的次数更少
2、B+树的所有数据存储在叶子节点上并且数据之间采用双向链表进行关联,所以在查询的时候只需查两个节点进行遍历就行,而B树需要遍历所有节点。所以B+树在范围查询上效率更高
3、在数据检索方面,由于B+树的所有数据都在叶子节点上,所以B+树的IO次数会更加稳定
4、B+树的全局扫描能力更强,因为只需要扫描叶子结点,而B树需要遍历整个树

四、什么是ThreadLocal?以及其实现原理?

ThreadLocal是一种线程隔离机制,它提供了多线程环境下对于共享变量访问的一个安全性。ThreadLocal采用了一种空间换时间的设计思想,在每个线程里面都有一个容器来存储共享变量的一个副本,然后每个线程只对自己变量的副本进行更新操作,这样既解决了线程安全问题又避免了多线程竞争锁资源的性能开销。ThreadLocal的实现原理是在Thread类中有一个成员变量ThreadLocalMap,ThreadLocalMap专门用来存储共享变量的副本,后续线程就从这里面去对变量进行操作,而不会影响全局变量的值,从而实现数据的隔离。

五、用户线程和守护线程

在Java中线程分为两类:用户线程和守护线程,默认情况下我们创建的线程或线程池都是用户线程,所以用户线程也被称之为普通线程,想要查看线程到底是用户线程还是守护线程,可以通过Thread类的isDaemon()方法来判断,如果返回的结果是 true 则为守护线程,反之则为用户线程。
守护线程(Daemon Thread)也被称之为后台线程或服务线程,守护线程是为用户线程服务的,当程序中的用户线程全部执行结束之后,守护线程也会跟随结束,当一个程序中的全部用户线程都结束执行之后,那么无论守护线程是否还在工作都会随着用户线程一块结束,整个程序也会随之结束运行。

六、服务降级与服务熔断的区别?

服务降级:服务降级一般是指在服务器压力剧增的时候,根据实际业务使用情况以及流量,对一些无关紧要的服务和页面进行关闭(调我的时候,给用户返回一个预留的值/默认值,该值也叫兜底数据),从而释放服务器资源的资源以保证核心业务的正常高效运行。服务器的资源是有限的,而请求是无限的。在用户使用即并发高峰期,会影响整体服务的性能,严重的话会导致宕机,以至于某些重要服务不可用。故高峰期为了保证核心功能服务的可用性,就需要对某些服务降级处理。可以理解为舍小保大。
服务降级是从整个系统的负荷情况出发和考虑的

服务熔断:应对雪崩效应的链路自我保护机制。可看作降级的特殊情况。当调用链路的某个微服务不可用或者响应时间太长时,会对下游服务进行服务熔断,切断对下游服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。

可以看作:服务熔断是原因,而服务降级是结果,服务熔断之后紧接着就会进行服务降级

七、服务雪崩的原因?

1、服务提供者不可用:硬件故障、程序Bug、缓存击穿、用户大量请求(流量洪峰:可以使用Nginx和Getway进行限流,也可以自定义限流算法:令牌桶、漏桶算法)
2、重试加大流量/重试次数过多:用户重试、代码逻辑重试
3、服务调用者不可用:同步等待造成资源耗尽

八、MySQL中InnoDB和MyISM的区别?

1、数据存储方式不同:MyISM的数据和索引是分开存储的,而InnoDB是将数据和索引存储在同一个文件中的
2、对事务的支持不同:InnoDB支持ACID事务,支持外键;而MyISM不支持事务,不支持外键
3、对于锁的支持不同:MyISM只支持表锁,InnoDB支持更丰富的锁

九、Redis的主从复制?

1、全量复制:Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份,Slave接收到数据文件后,存盘并加载到内存中
2、增量复制:Slave初始化后,开始正常工作时主服务器发生的写操作同步到从服务器的过程
Redis主从同步策略:主从刚刚连接的时候,进行全量同步;全量同步结束后,会进行增量同步。当然,如果有需要,Slave 在任何时候都可以发起全量同步。
Redis同步策略是:无论如何首先会尝试进行增量同步,如不成功,再要求Slave进行全量同步

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个射手座的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值