自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 1.注解驱动

注意,order决定的是bean加载顺序而不是执行顺序:https://blog.csdn.net/weixin_43888891/article/details/127481825。如果加上order注解,那么order注解值小的先被加载,之后拦截方法先执行。@Inject:java规范的注解,要导入javax.inject包,功能和@Autowired一样,但是没有reqquired属性。@Resource:java规范的注解,默认用方法名/文件名装配,没有@Qualifier和@Primary支持。

2023-06-15 15:18:30 124 1

原创 6.集成WebSocket

本质原因:spring管理的都是单例(singleton)和 websocket (多对象)相冲突。因为WebSocket 是一个多例,因为你需要多个对象来保存链接,所以就和单例无缘了,然而我们交给Spring管理的是单例的东西,那么我们可以从这里知道,WebSocket的对象是不能交给Spring管理的,此时我们有两种解决方案;是单例的东西,那么我们可以从这里知道,WebSocket的对象是不能交给Spring管理的,此时我们有两种解决方案;(3)封装WebSocket服务端,对应4个监听事件。

2023-06-15 15:18:28 138

原创 3.集成MVC

SpringBoot集成MVC文章目录SpringBoot集成MVC1.1WebMvcConfigurer接口(1)简介(2)具体使用1.2RequestContextHolder类(1)简介(2)基本使用(3)源码分析2.如何统一接口封装3.如何进行参数校验(1)实现案例(2)进一步理解①分组校验②@Validated和@Valid的区别③自定义Validation(3)校验注解大全4.如何统一异常处理(1)@ControllerAdvice+@ExceptionHandler+@ResponseSta

2023-06-15 15:17:57 175

原创 2.自动装配原理

根据代码可以看到,会去取@EnableConfigurationProperties注解的value值,此例中是RedisProperties,所以会把RedisProperties这个类装配进IOC容器。从上一步@EnableAutoConfiguration注解得知,会从spring.facorties中自动装配一些类,那么这些类中的一些属性又是怎么赋值上去的呢?包含了两个重要注解,一个是@AutoConfigurationPackage,一个是@Import(⭐关于@Import注解请看上一章)

2023-06-15 15:17:17 74

原创 6.WebScoket

以上过程都是利用http通信完成的,称之为websocket协议握手(websocket Protocol handshake),经过这握手之后,客户端和服务端就建立了websocket连接,以后的通信走的都是websocket协议了。具体来讲,我们在客户端构建一个websocket实例,并且为它绑定一个需要连接到的服务器地址,当客户端连接服务端的时候,会向服务端发送一个类似下面的http报文。初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?

2023-06-15 15:15:15 185

原创 5.SpringMVC

大多数应用程序只有一个WebApplicationContext,除此之外也可以一个Root WebApplicationContext 被多个WebApplicationContext实例访问,然后各自拥有自己的WebApplicationContext 配置。官网:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-servlet-context-hierarchy。

2023-06-15 15:14:23 46

原创 4.Spring 事务

解答:因为spring事务是基于aop的代理机制,当方法中调用this本身的方法时候即使在this的方法标明事务注解,但是事务注解会失效。当前层的回滚不会影响上层的回滚,但上层的回滚会影响下层的回滚。4、如果下层回滚,最上层不回滚,则最终事务仍是作为正常提交成功的事务,仍会触发事务提交成功后的事件,并不会触发事务回滚的事件。即最终事务的状态由最顶层的事务决定。3、如果是通过抛出异常导致的回滚,这个会触发整个事务的回滚(Sping的事务处理中异常的回滚处理和手动回滚走的不同的处理逻辑)。

2023-06-15 15:13:45 52

原创 3.Spring AOP

aop支持的所有切入点函数:https://blog.csdn.net/xubo_ob/article/details/78182014?总结:Spring AOP默认在目标类实现接口时是通过JDK代理实现的,只有非接口的是通过Cglib代理实现的。同一个方法被多个 Aspect 类拦截:https://my.oschina.net/u/3434392/blog/1625493。SpringBoot2.x的AOP:默认cglib,用户想要默认用jdk则要去配置proxyTargetClass。

2023-06-15 15:13:03 65

原创 2.Spring IOC

现在通过上面的代码,总结一下IOC容器初始化的基本步骤:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVlYN99t-1686813131983)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220701104636739.png)]初始化的入口在容器实现中的 refresh()调用来完成。

2023-06-15 15:12:31 58

原创 1.Spring简介和组成

控制反转(IOC):将对象的创建权交给spring管理,对象创建由主动式变为被动式。依赖注入(DI):应用程序代码从IOC容器中查找bean,然后注入到应用程序的行为叫做依赖注入。IOC是一种设计思想,DI是它的一种实现面向切面编程(AOP)事务管理容器:Spring是一个容器,管理所有bean的生命周期。

2023-06-15 15:11:53 41

原创 6.数据同步

AOF 和 RDB,如果 Redis 发生了宕机,它们可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性。不过,即使用了这两种方法,也依然存在服务不可用的问题。如果这个实例宕机了,它在恢复期间,是无法服务新来的数据存取请求的。那我们总说的 Redis 具有,又是什么意思呢?一是数据尽量少丢失二是服务尽量少中断。,而对于后者,Redis 的做法就是增加副本冗余量(即),将一份数据同时保存在多个实例上。

2023-06-14 09:43:14 48

原创 8.哨兵集群

通过这个方式,哨兵 2 和 3 也可以建立网络连接,这样一来,哨兵集群就形成了。接着,哨兵就可以根据从库列表中的连接信息,和每个从库建立连接,并在这个连接上持续地对从库进行监控。在配置哨兵的信息时,我们只需要用到下面的这个配置项,设置主库的 IP 和端口,并没有配置其他哨兵的连接信息。这是因为,在哨兵的监控任务中,它需要对主从库都进行心跳判断,而且在主从库切换完成后,它还需要通知从库,让它们和新主库进行同步。具体的操作步骤是,客户端读取哨兵的配置文件后,可以获得哨兵的地址和端口,和哨兵建立网络连接。

2023-06-14 09:42:49 36

原创 7.哨兵模式

在主从复制模式下,如果从库发生故障了,客户端可以继续向主库或其他从库发送请求,进行相关的操作,但是如果主库发生故障了,那就直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了。无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。所以,如果主库挂了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。

2023-06-14 09:42:14 519

原创 3.高性能IO模型

以 Get 请求为例,SimpleKV 为了处理一个 Get 请求,需要监听客户端请求(bind/listen),和客户端建立连接(accept),从 socket 中读取请求(recv),解析客户端发送请求(parse),根据请求类型读取键值数据(get),最后给客户端返回结果,即向 socket 中写回数据(send)。socket() 方法会返回主动套接字,然后调用 listen() 方法,将主动套接字转化为监听套接字,此时,可以监听来自客户端的连接请求。一方面,Redis 的大部分操作在。

2023-06-14 09:41:13 50

原创 5.RDB快照

这当然不是理想的结果,所以需要有RDB,对 Redis 来说,它实现类似照片记录效果的方式,就是把某一时刻的状态以文件的形式写到磁盘上,也就是快照。虽然跟 AOF 相比,快照的恢复速度快,但是,快照的频率不好把握,如果频率太低,两次快照间一旦宕机,就可能有比较多的数据丢失。如下图所示,T1 和 T2 时刻的修改,用 AOF 日志记录,等到第二次做全量快照时,就可以清空 AOF 日志,因为此时的修改都已经记录到快照中了,恢复时就不再用日志了。在按快门前,要记着提醒朋友不要乱动,否则拍出来的照片就模糊了。

2023-06-14 09:40:51 100

原创 2.数据结构

Redis 之所以能快速操作键值对,一方面是因为 O(1) 复杂度的哈希表被广泛使用,包括 String、Hash 和 Set,它们的操作复杂度基本由哈希表决定,另一方面,Sorted Set 也采用了 O(logN) 复杂度的跳表。不过,集合类型的范围操作,因为要遍历底层数据结构,复杂度通常是 O(N)。这里,我的建议是:用其他命令来替代,例如可以用SCAN来代替,避免在 Redis 内部产生费时的全集合遍历操作。表。不过,集合类型的范围操作,因为要遍历底层数据结构,复杂度通常是 O(N)。

2023-06-14 09:40:35 40

原创 4.AOF日志

Redis用作缓存应用将会存在一个问题就是,当Redis服务器宕机后,内存中的数据会全部消失,。目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。

2023-06-14 09:40:00 102

原创 1.基本架构

Redis(Remote Directory server)是一款基于内存的键值型数据库,它能够高速的读/写、具有丰富的数据类型、支持持久化(AOF,RDB)存储、支持数据备份(主从复制,哨兵模式)

2023-06-14 09:39:57 33

原创 9. 事务

(1)事务是一系列动作单元的组合,这些动作要么一起执行成功,要么一起执行失败。事务具有一个重要的ACID属性,分别是原子性(Atomic):事务是原子性操作,事务中的动作要么都成功,要么都失败一致性(Consistence):一旦事务中的所有动作成功完成,事务就需要提交隔离性(Isolation):多个事务有可能会同时处理相同的数据,因此每个事务都需要隔离起来(隔离等级)持久性(Durability):事务一旦完成,无论系统发生什么错误,结果都不会受到影响。

2023-06-14 09:37:36 39

原创 10. 锁

如果我们的⼀些业务场景不允许读取记录的旧版本,⽽是每次都必须去读取记录的最新版本,⽐⽅在银⾏存款的事务中,你需要先把账户的余额读出 来,然后将其加上本次存款的数额,最后再写到数据库中。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gs5qEi13-1686706568853)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220905164139982.png)](2)写-写事务并发:加锁。

2023-06-14 09:36:21 41

原创 8.Explain关键字

⼀条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后⽣成⼀个所谓的执⾏计划,这个执⾏计划展示了接下来具体执⾏查询的⽅式,⽐如多 表连接的顺序是什么,对于每个表采⽤什么访问⽅法来具体执⾏查询等等。设计MySQL的⼤叔贴⼼的为我们提供了EXPLAIN语句来帮助我们,它的作用就是查看某个查询语句的具体执行计划。

2023-06-13 14:45:51 36

原创 7.基于成本的优化

我们之前⽼说MySQL执⾏⼀个查询可以有不同的执⾏⽅案,它会选择其中成本最低,或者说代价最低的那种⽅案去真正的执⾏查询。I/O成本:执行sql需要扫描的页数的数量 * 1.0CPU成本:执行sql需要读取以及检测的记录数量 * 0.2。

2023-06-13 14:43:14 32

原创 4.B+树索引

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBCP7ulU-1686638463676)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824152808674.png)]用户记录在叶子节点,索引记录在非叶子节点如图所示,从根节点出发,有非叶子节点的数据页在user_records存放的是索引记录,和用户记录一样是以链表形式按照主键从小到大存放,索引记录只有两列分别是主键值和页码。

2023-06-13 14:42:58 25

原创 6.多表连接原理

⼀般情况下,我们都把只涉及单表的过滤条件放到WHERE⼦句中,把涉及两表的过滤条件都放到ON⼦句中,我们也⼀般把放到ON⼦句中的过滤条件也称之为连 接条件。通过启动参数或者系统变量join_buffer_size进行配置,默认大小为262144字节(也就是256KB),最小可以设置为128字节。算法思想:主表只要访问一次,而从表会被访问多次。具体访问几遍取决于对主表执行单表查询后的结果集中的记录条数。join buffer:存放多条主表查询数据。144字节(也就是256KB),最小可以设置为128字节。

2023-06-13 14:42:18 100

原创 5.单表访问方法

我们在第一章的时候就说过,一条sql的执行需要经过连接管理,解析与优化,存储引擎。那么在第二步中,将解析后的文本进行查询优化后,会生成一个执行计划。这个执⾏计划表明了应该使⽤哪些索引进⾏查询,表之间的连接顺序是 啥样的,最后会按照执⾏计划中的步骤调⽤存储引擎提供的⽅法来真正的执⾏查询,并将查询结果返回给⽤户。下面就来剖析查询优化。

2023-06-13 14:41:46 17

原创 1.系统架构

每当有⼀个客户端进程连接到服务器进程时,服务器进程都会创建⼀个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另⼀个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。查询优化:语法解析之后,MySQL的优化程序会对我们的语句做⼀些优化,如外连接转换为内连接、表达式简化、⼦查询转为连接吧啦吧啦的⼀堆东⻄。服务器处理客户端请求的过程:客户端进程发送一段纯文本(MySQL语句),服务器进程处理后返回一段纯文本。

2023-06-13 14:41:18 50

原创 3.InnoDB数据页结构

⻚是MySQL中磁盘和(存储引擎)内存交互的基本单位,也是存储引擎管理存储空间的基本单位。InnoDB是⼀个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。⽽真正处理数据的过程是发⽣在内存中的,所以需要把磁盘 中的数据加载到内存中,如果是处理写⼊或修改请求的话,还需要把内存中的内容刷新到磁盘上。⽽我们知道读写磁盘的速度⾮常慢,和内存读写差了⼏个数量 级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要⼀条⼀条的把记录从磁盘上读出来么?

2023-06-13 14:40:42 35

原创 2.InnoDB记录结构

MySQL5.7默认Dynamic。这两种⾏格式类似于COMPACT⾏格式,只不过在处理⾏溢出数据时有点⼉分歧,它们不会在记录的真实数据处存储字符串的前768个字节,⽽是把所有的 字节都存储到其他⻚⾯中,只在记录的真实数据处存储其他⻚⾯的地址。行溢出:⼀个⻚⼀般是16KB,当记录中的数据太多,当前⻚放不下的时候,会把多余的数据存储到其他⻚中,这种现象称为⾏溢出。行格式,随着时间的推移,他们可能会设计出更多的行格式,但是不管怎么变,在原理上大体都是相同的。会把多余的数据存储到其他⻚中,这种现象称为⾏溢出。

2023-06-13 14:40:09 22

原创 1.4虚拟机性能监控和故障处理工具

参数:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zOGyfxqM-1686638171273)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220314144618999.png)]概念:jstat命令用于统计或者监视虚拟机进程运行时的信息数据,包括类加载、内存、垃圾回收、即时编译等数据。概念:jps命令可以列出主机上所有的虚拟机进程,包括LVMID。

2023-06-13 14:37:55 46

原创 2.1虚拟机类加载机制

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83uFJDQw-1686638190412)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220321190306773.png)]一个类加载器接收到了一个类的加载请求时,它不会尝试加载这个类而是向上委派父加载器去加载,如果父类加载器没法加载才会自己加载。每一个层次的加载器都是这样,这也是为什么一个类要加载会先去加载它的父类。

2023-06-13 14:36:44 25

原创 1.3内存分配策略和垃圾回收器

程序计数器、虚拟机栈、本地方法栈随着线程而生随着线程而亡,占用内存大小在编译期间就确定好了,因此不需要去考虑回收问题,当方法结束或者线程死亡这部分内存也随之回收掉。堆,方法区需要进行垃圾回收。

2023-06-09 09:28:11 28

原创 1.2HotSpot虚拟机对象

轻量级锁认为竞争存在,但是竞争的程度很轻,一般两个线程对于同一个锁的操作都会错开,或者说稍微等待一下(自旋),另一个线程就会释放锁。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁膨胀为重量级锁,重量级锁使除了拥有锁的线程以外的线程都阻塞,防止CPU空转。,然后重新偏向新的线程,如果原来的线程依然存活,则马上执行那个线程的操作栈,检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁,(线程来访问它的时候,它会偏向这个线程,此时,对象持有偏向锁。

2023-06-09 09:26:30 21

原创 1.1运行时数据区

①方法正常返回②遇到异常结束,那么会看当前栈帧是否处理,如果没法处理则会抛给上一层栈帧,看它是否处理,如果仍然不处理则继续往上抛。定义:每一个java进程创建时都会创建一JVM,一个JVM一个方法区(之前叫永久代)。特点 :不会有GC问题,但会有OOM问题(和虚拟机栈一样,在创建或者扩展失败时,就会报OOM)方法里会调用其它方法,此时就会有新的栈帧入栈成为当前栈帧。定义:每一个线程被创建后时都会创建一个虚拟机栈,内部保存着一个个栈帧,对应一个个方法调用。包括局部变量表,操作数栈,动态链接,方法返回地址。

2023-06-09 09:24:16 16

原创 1.8stream流

combiner):在串行流(stream)中,该方法跟第二个方法一样,即第三个参数combiner不会起作用。在并行流(parallelStream)中,我们知道流被fork join出多个线程进行执行,此时每个线程的执行流程就跟第二个方法reduce(identity,accumulator)一样,而第三个参数combiner函数,则是将每个线程的执行结果当成一个新的流,然后使用第一个方法reduce(accumulator)流程进行规约。否则返回空的optional。

2023-06-09 09:22:25 24

原创 2.0多线程

AQS(AbstractQueuedSynchronizer)是一个抽象队列同步器,位于java.concurrent.locks包下。用于构造锁(ReentrantLock,ReentrantReadWriteLock)和同步器(CountDownLatch,CyclicBarrier,Semaphore)AQS规定如果被线程请求的共享资源空闲,那么将当前请求共享资源的线程设置为工作线程并且将共享资源设置为锁定状态(state==1)。当共享资源处于锁定状态时,其余请求共享资源的线程进入阻塞队列等待唤醒。

2023-06-09 09:22:00 69

原创 1.7lambda表达式

lambda表达式可以看做是一个Object(匿名内部类),它的目标类型为函数式接口(只有一个未实现的方法的抽象类/接口)一个接口/抽象类,只有一个未实现的方法,那么这个接口可以被称为函数式接口。

2023-06-09 09:21:49 30

原创 1.9IO流

key是一个“interest集合”,意思是在通过Selector监听Channel时对什么事件感兴趣。可以理解成,从服务端接收到的数据,读到buffer里面。相对于buffer来说,被输入了数据,也就是通道向buffer写数据。SelectionKey为Selector对当前注册上的Channel所关心的事件。lectionKey为Selector对当前注册上的Channel所关心的事件。Java程序需要和外部进行数据交互时,需要用到IO流。这个外部可以是很多介质。阻塞:read时读不到数据,阻塞。

2023-06-09 09:21:20 19

原创 1.6反射

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ut2Tc8NQ-1686273532291)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220117090447601.png)]反射就是在运行状态下,对于任意一个类都能够获取到它的所有属性和方法,对于任意一个对象都能够调用它的所有属性和方法。反射其实就是将一个类中的信息映射成一个个java对象。

2023-06-09 09:18:58 29

原创 1.5泛型

泛型,即“参数化 类型一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

2023-06-09 09:17:25 16

原创 1.4异常

**/*** 错误码/*** 异常体} }

2023-06-09 09:16:45 17

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除