自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 资源 (1)
  • 收藏
  • 关注

原创 Spring注解源码解析:@Transactional

ConfigurationClassPostProcessor中,工厂后处理器的原生接口BeanFactoryPostProcessor中的postProcessBeanFactory方法:方法postProcessBeanDefinitionRegistry中的逻辑是类似的,都是通过容器获取到一个hash code。然后通过集合factoriesPostProcessed,判断方法postProcessBeanFactory是否已经被执行过了,集合factoriesPostProcessed同样也是用来防

2022-06-21 17:10:38 869

原创 Spring注解源码解析:@Autowired

ConfigurationClassPostProcessor中,工厂后处理器的原生接口BeanFactoryPostProcessor中的postProcessBeanFactory方法:方法postProcessBeanDefinitionRegistry中的逻辑是类似的,都是通过容器获取到一个hash code。然后通过集合factoriesPostProcessed,判断方法postProcessBeanFactory是否已经被执行过了,集合factoriesPostProcessed同样也是用来防

2022-06-12 23:33:54 753

原创 Spring注解源码解析(2):@Configuration和@Bean

ConfigurationClassPostProcessor中,工厂后处理器的原生接口BeanFactoryPostProcessor中的postProcessBeanFactory方法:方法postProcessBeanDefinitionRegistry中的逻辑是类似的,都是通过容器获取到一个hash code。然后通过集合factoriesPostProcessed,判断方法postProcessBeanFactory是否已经被执行过了,集合factoriesPostProcessed同样也是用来防

2022-06-12 22:41:06 296

原创 Spring注解源码解析(1):@Configuration和@Bean

流程@Controller、@Service、@Repository的本质是@Component1.AnnotationConfigApplicationContext沿着AnnotationConfigApplicationContext的构造方法,看下Spring在源码层面又是如何处理标注了注解@Component的类:方法this()中,初始化了两个成员变量this.reader和this.scanner,既然在构造方法中这么刻意的初始化它们,很有可能这两个成员变量的初始化逻辑中可以看到首先会初

2022-06-11 23:48:12 303

原创 Spring注解源码解析:@Component

流程@Controller、@Service、@Repository的本质是@Component1.AnnotationConfigApplicationContext沿着AnnotationConfigApplicationContext的构造方法,看下Spring在源码层面又是如何处理标注了注解@Component的类:方法this()中,初始化了两个成员变量this.reader和this.scanner,既然在构造方法中这么刻意的初始化它们,很有可能这两个成员变量的初始化逻辑中可以看到首先会初

2022-06-11 22:41:25 567

原创 Spring bean加载流程

Spring bean流程

2022-06-11 21:38:10 63

原创 spring-ioc原理解析

1.refresh()@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { //调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识 prepareRefresh(); //创建beanFactory.主要是加载bean的信息,分为定位,加载,注册 Configur

2022-01-19 23:17:39 80

原创 spring-aop原理解析

1.@EnableAspectJAutoProxy原理@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy { /** * Indicate whether subclass-based (CGLIB) proxies are to b

2022-01-17 00:11:23 71

原创 spring整合mybatis原理

spring整合mybatis原理//MyBatis 中最重要的核心,SqlSessionFactory ,我们要把它交给 SpringFramework 统一管理,而 MyBatis 整合 SpringFramework 的整合包中,有这么一个 FactoryBean ,借助它就可以创建出 SqlSessionFactory : <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

2021-12-08 23:37:55 402

原创 mybaits执行流程流程(总)

一mybaits执行流程流程(总)二.mybatis的几大“组件”我这里说的“组件”,可以理解为Mybatis执行过程中的很重要的几个模块。2.1 SqlSessionFactoryBuilder从名称长可以看出来使用的建造者设计模式(Builder),用于构建SqlSessionFactory对象1.解析mybatis的xml配置文件,然后创建Configuration对象(对应标签);2.根据创建的Configuration对象,创建SqlSessionFactory(默认使用Defaul

2021-12-07 23:48:04 934

原创 myabtis执行流程(四)–MapperProxy

myabtis执行流程(四)–MapperProxyMapperProxy//MapperProxy在执行时会触发此方法@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if (Object.class.equals(method.getDeclaringClass())) { return method.inv

2021-12-07 23:10:49 390

原创 myabtis执行流程(三)—getMapper

myabtis执行流程(三)–getMapper在mybatis中,通过MapperProxy动态代理咱们的dao, 当咱们执行自己写的dao里面的方法的时候,其实是对应的mapperProxy在代理。那么,咱们就看看怎么获取MapperProxy对象吧:(1)通过SqlSession从Configuration中获取。//什么都不做,直接去configuration中找@Override public <T> T getMapper(Class<T> type) {

2021-12-07 22:53:24 86

原创 mybatis执行流程(二)——DefaultSqlSession

二 DefaultSqlSession(1)当我们获取到SqlSessionFactory之后,就可以通过SqlSessionFactory去获取SqlSession对象@Override public SqlSession openSession() { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false); } private SqlSession openS

2021-12-07 22:46:03 524

原创 一.SQL执行流程分析(一)—sessionFactory

###一.SQL执行流程分析(一)—sessionFactory(1)首先,SqlSessionFactoryBuilder去读取mybatis的配置文件,然后build一个DefaultSqlSessionFactorypublic SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { //通过XMLConfigBuilde

2021-12-07 22:39:10 195

原创 mysql---分表分库

分表分库我们都建议MySQL单表数据量不要超过1000万,最好是在500万以内,如果能控制在100万以内,那是 最佳的选择了,基本单表100万以内的数据,性能上不会有太⼤的问题,前提是,只要你建好索引就⾏,其实保证 MySQL⾼性能通常没什么特别⾼深的技巧,就是控制数据量不要太⼤,另外就是保证你的查询⽤上了索引,⼀般就没 问题。1.大型电商网站的上亿数据量的用户表如何进行水平拆分?⼀个背景是⼀个中型的电商公司,不 是那种顶级电商巨头,就算是⼀个垂直领域的中型电商公司吧,那么他覆盖的⽤户⼤概算他有1亿以

2021-02-21 22:01:23 511 1

原创 mysql整理

一InnoDB记录存储结构和数据页面结构1.为什么不能直接更新磁盘上的数据?​ 因为磁盘随机读写的性能是最差的,所以直接更新磁盘文件,必然导致我们的数据库完全无法抗下任何一点点稍微高 并发一点的场景​ 所以MySQL才设计了如此复杂的一套机制,通过内存里更新数据,然后写redo log以及事务提交,后台线程不定时刷 新内存里的数据到磁盘文件里 通过这种方式保证,你每个更新请求,尽量就是更新内存,然后顺序写日志文件。 更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能

2021-02-21 22:00:14 507

原创 顺序消息

1.顺序消息1.1消息队列负载RocketMQ 首先需要通过 RebalanceService 线程实现消息队列的负载, 集群模式下同一个消 费组 内的消 费者共同承担其订阅主题下消息队列的消费, 同一个消息消费队列在同一时刻只会被消费组内一个消费者消费, 一个消费者同一时刻可以分配多个消费队列List<PullRequest> pullRequestList = new ArrayList<PullRequest>();for (MessageQueue mq : mqSe

2020-10-21 23:44:22 250

原创 消息消费过程

1.消息消费过程PullMessageService 负责对消息队列进行消息拉取,从远端服务器拉取消息后将消息存入 ProcessQueue 消息队列处理队列中,然后调用 Consum Message Service#submitConsumeRequest 方法进行消息消费,使用线程池来消费消息,确保了消息拉取与消息消费的解祸1.1消息消费消费者消息消费服务 ConsumeMessageConcurrentlyService 的主要方法是 submitConsumeRequest提交消费请求,具

2020-10-19 23:54:21 387

原创 消息拉取流程

1.消息拉取流程1.PullMessageService 实现机制@Overridepublic void run() { log.info(this.getServiceName() + " service started"); while (!this.isStopped()) { try { PullRequest pullRequest = this.pullRequestQueue.take(); this.p

2020-10-19 20:55:06 683 1

原创 消费者启动流程

1.消费者启动流程@Overridepublic void start() throws MQClientException { setConsumerGroup(NamespaceUtil.wrapNamespace(this.getNamespace(), this.consumerGroup)); this.defaultMQPushConsumerImpl.start();}public synchronized void start() throws MQClientEx

2020-10-14 23:09:29 162

原创 RocketMQ实时更新消息消费队列 索引文件

1.RocketMQ实时更新消息消费队列 索引文件当消息生产者提交的消息存储在CommitLog文件中,ConsumeQueue,IndexFile需要及时更新,RocketMQ通过开启一个线程ReputMessageServcie来准实时转发CommitLog文件更新事件,相应的任务处理器根据转发的消息及时更新ConsumeQueue,IndexFile文件if (this.getMessageStoreConfig().isDuplicationEnable()) { this.reputMes

2020-10-09 23:26:47 622

原创 RocketMQ消息刷盘

RocketMQ消息刷盘流程图1.源码分析RocketMQ 存储与读写是基于 JDK NIO 的内存映射机制( MappedByteBuffer )的,消息存储时首先将消息追加到内存,再根据配 的刷盘 略在不同时间进行刷写磁盘 ,如果是同步刷盘,消息追加到内存后,将同步调用 MappedByteBuffer的force()方法;;如果是异步刷盘,在消息追加到内存后立刻返回给消息发送端 RocketMQ 使用 一个单独的线程按照某一个设定的频率执行刷盘操作.通过在 broker 配置文件中配置 flu

2020-09-30 16:38:11 509

原创 RocketMQ的消息存储

RocketMQ的消息存储RocketMQ 会创建多个MappedFile用来存储文件,每个MappedFile大小固定,有自己的内存缓冲区和对应的系统文件,所有的MappedFile由CommitLog中的MappedFileQueue统一维护每个Broker都对应有一个MessageStore,专门用来存储发送到它的消息,不过MessageStore本身不是文件,只是存储的一个抽象,MessageStore 中保存着一个 CommitLog,CommitLog 维护了一个 MappedFileQue

2020-09-28 23:42:06 146

原创 RocketMq消费发送源码解析

RocketMq消费发送流程图1.生产者启动流程public void start(final boolean startFactory) throws MQClientException { //1.检查 productGroup 是否符合要求; this.checkConfig(); //2. 并改变生产者 instanceName 为进程 ID if (!this.defaultMQProducer.getProdu

2020-09-26 23:04:50 175

原创 NameServer 源码分析

NameServer 源码分析流程图1.NameServer 架构设计Broker 消息服务器在启动时向所有 Name Server 注册,消息生产者(Producer)在发送消息之前先从 Name Server 获取 Broker 服务器地址列表,然后根据负载算法从列表中选择一台消息服务器进行消息发送 NameServer 与每台 Broker 服务器保持长连接,并间隔 30sBroker 是否存活,如果检测到 Broker 从路由注册表中将其移除 但是路由变化不会马上通知消息生产者,为什么要这样

2020-09-26 02:12:39 195

原创 redis基准压测

1、对redis读写分离架构进行压测,单实例写QPS+单实例读QPSredis-3.2.8/src./redis-benchmark -h 192.168.31.187-c Number of parallel connections (default 50)-n Total number of requests (default 100000)-d Data size of SET/GET value in bytes (default 2)根据你

2020-05-11 23:08:32 172

原创 搭建redis主从架构,读写分离

1、启用复制,部署slave nodewget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gztar -xzvf tcl8.6.1-src.tar.gzcd /usr/local/tcl8.6.1/unix/./configuremake && make install使用redis-3.2.8.tar.gz(截止2017年4月的最新稳定版)tar -zxvf redis-3.2.8.tar.gzcd red

2020-05-11 23:07:06 106

原创 安装单机版redis

1、安装单机版rediswget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gztar -xzvf tcl8.6.1-src.tar.gzcd /usr/local/tcl8.6.1/unix/./configuremake && make install使用redis-3.2.8.tar.gz(截止2017年4月的最新稳定版)tar -zxvf redis-3.2.8.tar.gzcd redis-3.2.

2020-05-11 23:04:37 71

原创 搭建4个centOs集群

1、在虚拟机中安装CentOS启动一个virtual box虚拟机管理软件(vmware,我早些年,发现不太稳定,主要是当时搭建一个hadoop大数据的集群,发现每次休眠以后再重启,集群就挂掉了)virtual box,发现很稳定,集群从来不会随便乱挂,所以就一直用virtual box了(1)使用课程提供的CentOS 6.5镜像即可,CentOS-6.5-i386-minimal.iso。(2)创建虚拟机:打开Virtual Box,点击“新建”按钮,点击“下一步”,输入虚拟机名称为eshop-

2020-05-11 23:03:07 185

原创 笔记——cpu占用过高排查思路和jvm old区占用过高排查思路

cpu占用过高排查思路top 查看占用cpu的进程 pidtop -Hp pid 查看进程中占用cpu过高的线程id tidprintf ‘%x/n’ tid 转化为十六进制jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位jvm old区占用过高排查思路top查看占用cpu高的进程jstat -gcutil pid 时间间隔 查看gc状况jm...

2020-02-07 00:11:18 193

原创 mysql思维导图

2020-01-12 02:13:02 121

原创 SQL语句是如何执行的

1. 一条SQL查询语句是如何执行的? mysql> select * from T where ID=10; 平时通常输入一条语句, 返回一个结果 , 却不知道这条语句在MySQL内部的执行过程,下面分析MySQL内部的执行过程;MySQL可以分为Server层和存储引擎层两部分Server层包括连接器、 查询缓存、 分析器、 优化器、 执行器等, 涵盖MySQL的大多数...

2019-12-31 16:15:26 510

原创 mysql——主从复制

1. MySQL主备的基本原理master将改变记录到二进制binlog,然后发送给slaveslave将master的binlog日志保存到中继日志(relay log)slave解析中继日志文件把数据同步到数据库中,mysql复制是异步的且串性化的2.MySQL是怎么保证主备一致的?binlog的存在确保了在备库执行相同的binlog,可以得到与主库相同的状态。3.MySQL ...

2019-12-31 16:14:28 105 1

原创 mysql——sql原理

1.SQL语句为什么变“慢”了​ 当内存数据页跟磁盘数据页内容不一致的时候, 我们称这个内存页为“脏页”。 内存数据写入到磁盘后, 内存和磁盘上的数据页的内容就一致了, 称为“干净页” , 平时执行很快的更新操作, 其实就是在写内存和日志, 而MySQL偶尔“抖”一下的那个瞬间, 可能就是在刷脏页(flush) 。2. 什么情况会引发数据库的flush过程呢?InnoDB的redo l...

2019-12-31 16:13:52 175 1

原创 mysql——隔离性与隔离级别

隔离性与隔离级别ACID(Atomicity、 Consistency、 Isolation、 Durability, 即原子性、 一致性、 隔离性、 持久性)1.隔离性​ 当数据库上有多个事务同时执行的时候, 就可能出现脏读(dirtyread) 、 不可重复读(non-repeatable read) 、 幻读(phantom read) 的问题, 为了解决这些问题, 就有了“隔离级别...

2019-12-31 16:12:19 150

原创 mysql——锁

MySQL里面的锁大致可以分成全局锁、 表级锁和行锁三类1.全局锁一个库被全局锁上以后, 你要对里面任何一个表做加字段操作, 都是会被锁住的。​ 对整个数据库实例加锁。 MySQL提供了一个加全局读锁的方法, 命令是Flush tables with read lock (FTWRL)。 当你需要让整个库处于只读状态的时候, 可以使用这个命令, 之后其他线程的以下语句会被阻塞: 数据...

2019-12-31 16:11:50 104

原创 mysql——索引

1. 索引的常见模型索引可以用于提高读写效率的数据结构很多, 这里介绍三种常见、 也比较简单的数据结构, 它们分别是哈希表、 有序数组和搜索树1. 哈希表哈希的思路很简单, 把值放在数组里, 用一个哈希函数把key换算成一个确定的位置, 然后把value放在数组的这个位置。 不可避免地, 多个key值经过哈希函数的换算, 会出现同一个值的情况。 处理这种情况的一种方法是, 拉出一个链...

2019-12-30 20:11:25 77

原创 springboot启动原理

2019-12-15 02:14:00 63

原创 Spring Boot原理分析

1.Spring Boot 简介简化Spring应用开发的一个框架;内嵌Servler容器减少了配置文件2.微服务每一个功能元素最终都是一个可独立替换和独立升级的软件单元;3.打包插件 <!-- 这个插件,可以将应用打包成一个可执行的jar包;--> <build> <plugins> <plu...

2019-12-13 00:46:19 94

原创 Spring事务原理解析

1.@EnableTransactionManagement原理@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementConfigurationSelector.class)public @interface EnableTransaction...

2019-12-09 00:05:53 82

日期控件.7z

jq日历控件

2017-08-30

空空如也

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

TA关注的人

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