自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL事务隔离级别

1、读未提交(READ UNCOMMITTED)MySQL事务隔离其实是依赖锁来实现的,加锁自然会带来性能的损失。而读未提交隔离级别是不加锁的,所以它的性能是最好的,没有加锁、解锁带来的性能开销。但是有利就有弊,这基本上就是裸奔了,所以连脏读的问题都没法解决。2、读已提交(READ COMMITTED)既然读未提交没办法解决脏数据的问题,那么就有了读提交。读提交就是一个事务只能读到其他事务已经提交过的数据,也就是其他事务调用commit命令之后的数据。3、可重复读(REPEATABLE READ)

2023-04-13 17:58:50 646 1

原创 Dubbo架构整体设计

在这里主要由四部分组成:● Provider: 暴露服务的服务提供方Protocol:负责提供者和消费者之间的协议交互数据Service:真实的业务服务信息,可以理解成接口和实现Container:Dubbo的运行环境● Consumer:调用远程服务的服务消费方Protocol:负责提供者和消费者之间的协议交互数据Cluster:感知提供者端的列表信息Proxy:可以理解成提供者的服务调用代理,由它接管Consumer中的接口调用逻辑。

2023-04-08 21:18:55 626

原创 ElasticSearch排序那点事-doc_values

DocValues 通过转置倒排索引和正排索引两者间的关系来解决这个问题。倒排索引将词项映射到包含它们的文档, Docvalues 将文档映射到它们包含的词项:当数据被转置之后,想要收集到每个文档行,获取所有的词项就非常简单了。所以搜索使用倒排索引查找文档,聚合操作收集和聚合 DocValues 里的数据,这就是 ElasticSearch。

2023-04-02 11:22:34 697

原创 ElasticSearch的Deep Paging 性能问题和解决方案

ES默认采用的分页方式是from + size的形式,类似于MySQL的分页limit。当请求数据量比较大时,ElasticSearch会对分页做出限制,因为此时消耗会很大。举个例子,一个索引分10个shards,然后一个搜索请求,from = 990,size = 10,这个时候,会带来严重的性能问题:CPU、内存、IO、网络带宽。CPU、内存和IO消耗很容易理解,网络带宽问题稍微难理解一点。

2023-03-29 16:38:03 506

原创 ElasticSearch索引文档写入和近实时搜索

众所周知,ElasticSearch存储的基本单元Shard,ES中一个Index可能分为多个Shard,事实上每个Shard都是一个Lucence的Index,并且每个Lucene Index由多个Segment组成,每个Segment事实上是一些倒排索引的集合,每次创建一个新的Document,都会归属于一个新的Segment,而不是去修改原来的Segment。

2023-03-27 17:18:35 1424

原创 Redis底层数据结构

Redis底层数据结构Redis没有表的概念,Redis实例所对应的db以编号区分,db本身就是key的命名空间。比如:user:1000作为key值,表示在user这个命名空间下id为1000的元素,类似于user表的id=1000的行。

2022-12-28 10:58:18 165

原创 Redis数据持久化

Redis数据持久化

2022-12-23 14:29:14 159

原创 MySQL性能分析工具

1. 统计SQL执行成本2. 分析查询语句:EXPLAIN

2022-11-30 09:54:13 481

原创 MySQL缓冲池-Buffer Pull

MySQL缓存池 Buffer-Pool

2022-11-17 17:36:25 896

原创 MySQL索引

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找算法 。

2022-11-14 17:24:04 298

原创 讲讲MySQL日志

MySQL的日志文件

2022-11-11 14:20:37 65

原创 Zookeeper源码分析-单机模式服务端启动

单机模式的ZK服务端逻辑写在ZooKeeperServerMain类中,由⾥⾯的main函数启动,整个过程如下:单机模式的委托启动类为: ZooKeeperServerMain。

2022-09-14 16:53:20 664

原创 你还在认为 count(1) 比 count(*) 效率高?

当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!从执行计划来看,count(1)和count(*)的效果是一样的,但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。如果count(1)是聚索引 id,那肯定是count(1)快,但是差的很小的。因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的。...

2022-08-29 10:29:01 119

原创 Zookeeper之Leader选举

Leader选举是zookeeper最重要的技术之⼀,也是保证分布式数据⼀致性的关键所在。当Zookeeper集群中的⼀台服务器出现以下两种情况之⼀时,需要进⼊Leader选举。(1) 服务器初始化启动。(2) 服务器运⾏期间⽆法和Leader保持连接。...

2022-08-12 15:22:27 990

原创 Zookeeper之ZAB协议

ZAB协议包括两种基本的模式: 崩溃恢复和消息⼴播。当整个服务框架启动过程中,或者是Leader服务器出现⽹络中断、崩溃退出或重启等异常情况时, ZAB协议就会进⼊崩溃恢复模式,同时选举产⽣新的Leader服务器。当选举产⽣了新的Leader服务器,同时集群中已经有过半的机器与该Leader服务器完成了状态同步之后, ZAB协议就会退出恢复模式,其中,所谓的状态同步 就是指数据同步,⽤来保证集群中过半的机器能够和Leader服务器的数据状态保持⼀致。...

2022-08-11 17:46:08 2116 1

原创 Netty如何解决TCP中的粘包和拆包问题

粘包和拆包是TCP网络编程中不可避免的,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。TCP是个“流”协议,所谓流,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。...

2022-07-29 17:14:49 2964

原创 高性能NIO框架-Netty

传统阻塞I/O服务模型Reactor模型根据Reactor的数量和处理资源池线程的数量不同,有3种典型的实现单Reactor单线程单Reactor多线程主从Reactor多线程。

2022-07-27 18:48:06 212

原创 痛并快乐的-NIO编程

缓冲区(Buffer)缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个数组,该对象提供了一组方法,可以更轻松地使用内存块,,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel提供从网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。Buffer类及其子类关系在NIO中,Buffer是一个顶层父类,它是一个抽象类,类的层级关系图,常用的缓冲区分别对应byte,short,int,long,float,double,char7种。...

2022-07-23 17:50:28 114

原创 Java-IO模型概述

1)I/O模型简单的理解就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能(2)Java共支持3种网络编程模型/IO模式BIO(同步并阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞)。

2022-07-23 17:30:49 177

原创 优雅实现Springboot+ Mybatis动态数据源

电商订单项目分正向和逆向两个部分:其中正向数据库记录了订单的基本信息,包括订单基本信息、订单商品信息、优惠卷信息、发票信息、账期信息、结算信息、订单备注信息、收货人信息等;逆向数据库主要包含了商品的退货信息和维修信息。数据量超过500万行就要考虑分库分表和读写分离,那么我们在正向操作和逆向操作的时候,就需要动态的切换到相应的数据库,进行相关的操作。现在项目的结构设计基本上是基于MVC的,那么数据库的操作集中在dao层完成,主要业务逻辑在service层处理,controller层处理请求。假设在执行dao层

2022-07-10 16:17:23 876

原创 一个实例带你了解SpringBoot-Mybatis自动配置源码

MyBatis 是一款优秀的持久层框架,Spring Boot官方虽然没有对MyBatis进行整合,但是MyBatis团队自行适配了对应的启动器,进一步简化了使用MyBatis进行数据的操作因为Spring Boot框架开发的便利性,所以实现Spring Boot与数据访问层框架(例如MyBatis)的整合非常简单,主要是引入对应的依赖启动器,并进行数据库相关参数设置即可。1.新建SpringBoot项目,并引入Mybatis的相关依赖pom.xml依赖:application.yaml配置:2.基

2022-07-10 11:44:35 2023

原创 无法遗漏-源码剖析-SpringBoot自动装配SpringMVC

在SpringBoot项目里面是可以直接使用诸如 @RequestMapping 这类的SpringMVC的注解,但是只是引入了web-starter的依赖,SpringBoot项目就可以接收Http请求了,这个是为啥呢?在一个普通的WEB项目中如何去使用SpringMVC,我们首先就是要在web.xml中配置如下配置:但是在SpringBoot中,并没有web.xml文件,原因是因为SpringBoot是基于Servelet3.0规范的,Servlet3.0规范中规定,要添加一个Servlet,除了采

2022-07-04 18:12:46 272

原创 很简单的源码剖析-SpringBoot内嵌Tomcat原理

Spring Boot默认支持Tomcat,Jetty,和Undertow作为底层容器。而Spring Boot默认使用Tomcat,一旦引入spring-boot-starter-web模块,就默认使用Tomcat容器。在启动springboot的时候可谓是相当简单,只需要执行以下代码:那些看似简单的事物,其实并不简单。我们之所以觉得他简单,是因为复杂性都被隐藏了。通过上诉代码,大概率可以提出以下几个疑问在SpringBoot的启动过程中会自动加载各个模块下的META-INF/spring.facto

2022-06-30 18:22:50 820

原创 原来自定义SpringBoot的Starter这么简单

SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。所有这些依赖

2022-06-29 10:19:21 185

原创 分六步让你了解SpringBoot的主方法-run启动项目

源码入口:org.springframework.boot.SpringApplication#run(java.lang.String…)整体源码:1 获取并启动监听器事件机制在Spring是很重要的一部分内容,通过事件机制我们可以监听Spring容器中正在发生的一些事件,同样也可以自定义监听事件。Spring的事件为Bean和Bean之间的消息传递提供支持。当一个对象处理完某种任务后,通知另外的对象进行某些处理,常用的场景有进行某些操作后发送通知...

2022-06-20 16:19:53 454

原创 带你了解SpringBoot项目的SpringApplication初始化

SpringBoot项目的mian函数SpringApplication 实例化过程,首先是进入带参数的构造方法,最终回来到两个参数的构造方法:1. 推断应用类型点击进入WebApplicationType.deduceFromClassPath()方法:因为项目中引入了Web的依赖,所以是一个Web项目,这个地方最终返回的是SERVLET,这个也是最常用的类型。从图中可以看出,最终初始化了7个ApplicationContextInitializer,而...

2022-06-09 22:21:29 549

原创 别再乱用了,这才是 @Validated 和 @Valid 的真正区别!!!

● @Valid是使用Hibernate validation的时候使用● @Validated是只用Spring Validator校验机制使用 @Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同,这里主要就这几种情况进行说明● @Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)● @Valid:可以用在方法、构造函数、方法参数和成员属性(field)上如: ● @Validated:提供分组功能,可

2022-06-08 13:24:47 2765 4

原创 两步了解SpringBoot自动配置

1. 概述自动配置:根据添加的jar包依赖,会自动将一些配置类的bean注册进ioc容器,我们可以需要的地方使用@autowired或者@resource等注解来使用它。Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法。@SpringBootApplication: SpringBoot 应用标注在某个类上说明这个类是 SpringBoot 的主配置类, SpringBoot 就应该运行这个类的 main() 方法启动 SpringBoot

2022-05-31 16:53:29 1049

原创 SpringBoot 基础

1.主要特性SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率;自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们;使部署变得简单,SpringBoot内置了三种Servlet容器,Tomca

2022-05-26 15:33:03 663

原创 Spring MVC 源码分析

1. DisptcherServlet介绍在MVC项目搭建的过程中,我们通常会在webapp下的web.xml文件中添加上一个servelet配置,而且通常我们使用的是DispatcherServlet这个类,如下列代码所示:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/200

2022-05-16 18:31:32 1712

原创 Spring MVC的url-pattern配置及原理分析

在SpringMVC中,我们通常会在web.xml文件中配置要拦截的url请求,这个时候就需要用到url-pattern来进行配置了。下面是一个web.xml的示例<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app> <display-name>A

2022-05-11 17:13:24 569

原创 Spring Web MVC工作流程

1.请求处理流程流程说明第⼀步:⽤户发送请求⾄前端控制器DispatcherServlet第⼆步: DispatcherServlet收到请求调⽤HandlerMapping处理器映射器第三步:处理器映射器根据请求Url找到具体的Handler(后端控制器),⽣成处理器对象及处理器拦截器(如果 有则⽣成)⼀并返回DispatcherServlet第四步: DispatcherServlet调⽤HandlerAdapter处理器适配器去调⽤Handler第五步:处理器适配器执⾏Handler第

2022-05-11 16:08:47 270

原创 Spring 声明式事务控制

声明式事务很⽅便,尤其纯注解模式,仅仅⼏个注解就能控制事务了思考:这些注解都做了什么?好神奇!@EnableTransactionManagement @Transactional1. @EnableTransactionManagement@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementConfigurationSelector.class)

2022-05-09 18:00:08 93

原创 Spring AOP源码剖析

1.AOP基础用例准备Bean定义@Componentpublic class AopBean { public void tech(){ System.out.println("java spring aop learning......"); }}Aspect定义@Component@Aspectpublic class AopAspect { @Pointcut("execution(* com.lagou.edu.AopBean.tech(..))"

2022-05-09 16:13:59 235

原创 Spring IOC循环依赖问题

1. 什么是循环依赖循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环。⽐如A依赖于B, B依赖于C, C⼜依赖于A。注意,这⾥不是函数的循环调⽤,是对象的相互依赖关系。循环调⽤其实就是⼀个死循环,除⾮有终结条件。Spring中循环依赖场景有:● 构造器的循环依赖(构造器注⼊)● Field 属性的循环依赖(set注⼊)其中,构造器的循环依赖问题⽆法解决,只能拋出 BeanCurrentlyInCreationException 异常,在解决属性循环依赖时

2022-05-08 18:27:58 467 3

原创 lazy-init 延迟加载机制原理

1. lazy-init延迟加载机制分析普通 Bean 的初始化是在容器启动初始化阶段执⾏的,⽽被lazy-init=true修饰的 bean 则是在从容器⾥第⼀次进⾏context.getBean() 时进⾏触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring能够识别的BeanDefinition并存到Hashmap⾥供下⾯的初始化时⽤,然后对每个BeanDefinition 进⾏处理,如果是懒加载的则在容器初始化阶段不处理,其他的则在容器初始化阶段进⾏初始化并

2022-05-08 17:24:14 472

原创 Spring Bean创建流程

创建Bean入口:org.springframework.context.support.AbstractApplicationContext#refresh进入finishBeanFactoryInitialization方法:进入beanFactory.preInstantiateSingletones方法:继续跟踪下去,进到org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean方法,直接找到方法中创建

2022-05-06 17:04:13 455

原创 BeanFactory创建流程

1. 获取BeanFactory在SpringIOC容器创建的主流程中,第二步就是获取一个BeanFactory对象,详情可见如下方法 org.springframework.context.support.AbstractApplicationContext#refresh,入口如下:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();进入**obtainFreshBeanFactory()**方法,看到如下

2022-05-06 14:09:15 1108

原创 Spring IOC容器初始化主流程

1. Spring IOC容器体系IoC容器是Spring的核⼼模块,是抽象了对象管理、依赖关系管理的框架解决⽅案。 Spring 提供了很多的容器,其中 BeanFactory 是顶层容器(根容器),不能被实例化,它定义了所有 IoC 容器 必须遵从的⼀套原则,具体的容器实现可以增加额外的功能,⽐如我们常⽤到的ApplicationContext,其下更具体的实现如 ClassPathXmlApplicationContext 包含了解析 xml 等⼀系列的内容,AnnotationConfigAppl

2022-05-05 14:09:20 1551

原创 Spring-FactoryBean和BeanFactory

一、FactoryBean在Spring中Bean有两种,一种是普通bean,一种是FactoryBean,通俗一点就是工厂Bean,FactoryBean可以⽣成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程。以下是FactoryBean的源码:下面使用FactoryBean创建自定义的Bean。首先创建Company类:创建CompanyFactoryBean类,实现FactoryBean接口:xml中注册Company对象,此时需要使用Comp

2022-04-27 17:08:43 542

空空如也

空空如也

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

TA关注的人

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