前言
高并发,几乎是每个程序员都想拥有的经验。原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时、CPU load升高、GC频繁、死锁、大数据量存储等等,这些问题能推动我们在技术深度上不断精进。
在过往的面试中,如果候选人做过高并发的项目,我通常会让对方谈谈对于高并发的理解,但是能系统性地回答好此问题的人并不多,大概分成这样几类:
1、对数据化的指标没有概念:不清楚选择什么样的指标来衡量高并发系统?分不清并发量和QPS,甚至不知道自己系统的总用户量、活跃用户量,平峰和高峰时的QPS和TPS等关键数据。
2、设计了一些方案,但是细节掌握不透彻:讲不出该方案要关注的技术点和可能带来的副作用。比如读性能有瓶颈会引入缓存,但是忽视了缓存命中率、热点key、数据一致性等问题。
3、理解片面,把高并发设计等同于性能优化:大谈并发编程、多级缓存、异步化、水平扩容,却忽视高可用设计、服务治理和运维保障。
4、掌握大方案,却忽视最基本的东西:能讲清楚垂直分层、水平分区、缓存等大思路,却没意识去分析数据结构是否合理,算法是否高效,没想过从最根本的IO和计算两个维度去做细节优化。
二、什么是循环依赖
循环依赖直白点就是发生在两个类,你引用我,我引用你
的状态,如图:
三、如果不依赖于Spring自己解决循环依赖如何解决
以上图为例,假设,我们能够创建完成AService
之后,放置到到一个缓存中,再去注入属性!每次注入属性的时候,所需要的属性值都从缓存中获取一遍,缓存中没有再去创建不就解决了?如图所示:
总结一下上面的流程:
AService
创建完成后将自己加入到二级缓存,然后开始注入属性- 发现
AService
依赖BService
于是先查询一级缓存是否有数据一级缓存没有就查询二级缓存,有就返回,没有就创建BService
- 缓存中没有,开始实例化
BService
,然后注入内部属性! - 注入内部属性时发现依赖
AService
,于是先查询一级缓存是否有数据一级缓存没有就查询二级缓存,有就返回,没有就创建,很显然,二级缓存是有数据的。于是从二级缓存取出AService
注入到BService
。 BService
创建完成后将自己从二级缓存挪到一级缓存,并返回。AService
获取到BService
后,注入到自己的属性中并把自己从二级缓存挪的一级缓存,返回AService
!- 至此,循环依赖创建完成!
那么有了上面的思路,我们如何用代码实现一遍我们的逻辑呢?
总结
本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!
重要的事:需要领取完整版的MySQL学习笔记的话,请转发+关注后点这里免费获取到免费的下载方式!
MySQL50道高频面试题整理:
bFJ1cmN1R2dB)到免费的下载方式!**
MySQL50道高频面试题整理: