自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring中一些工具类

一、ClassUtils1、forName方法创建Class对象,但不是直接创建。如果是一些常见的类,如float、int、short就直接返回对应的class,如果是某些数组,也会返回对应的类型。如果都不是,就会Class.forName创建该类,第一次创建失败后,会把类名转成内部类创建,如果还失败,就抛出异常public static Class<?> forName(String name, @Nullable ClassLoader classLoader) thro

2020-06-11 22:25:54 284

原创 Vue学习笔记四

非单文件组件、vue cli的安装、render函数、ref函数、props配置、mixin混入、插件、scoped样式

2022-08-20 10:11:30 193 1

原创 Vue学习笔记三

监测数据原理、收集表单数据,内置指令,自定义指令,生命周期

2022-07-14 15:33:24 319

原创 Vue学习笔记二

监视属性、绑定样式、条件渲染、列表渲染

2022-07-11 16:51:57 1177

原创 Vue学习笔记一

模板语法、数据绑定、MVVM、Object.defineProperty、事件处理、计算属性

2022-06-16 22:34:09 136

原创 Spring 事务回滚实现原理

比如Controller调Service的方法,在Service层的方法上加了@Transaction注解,那么Controller调的这个Service对象就会变成代理对象,核心类:TransactionAspectSupport protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass, final InvocationCallback invocati

2022-04-24 16:15:10 2651

原创 面试题 MySQL

一、MyISAM和InnoDB存储引擎的区别1、MyISAM不支持事务,不支持外键约束,索引文件和数据文件分开,这样在内存里可以缓存更多的索引,对查询的性能更好,适用于少量的插入,大量查询的场景。报表系统是比较适合MyISAM存储引擎的2、Innodb 支持事务,支持外键约束,有成熟的高并发、高可用、分库分表、读写分离、主从切换的方案...

2022-04-01 10:57:19 1540

原创 面试题 网络

一、TCP/IP四层模型四层模型是从七层模型简化而来的1、OSI七层模型应用层、表示层、会话层、传输层、网络层、数据链路层、物理层2、TCP/IP四层模型物理层:将两台设备通过网线、光缆等方式,通过物理方式连通,用来传输0和1的电路信号数据链路层:物理层传输0和1的电信号后,还需要根据协议,来辨别这些0和1的电信号代表什么意思,以太网协议就是这种公共的协议。以太网协议规定,每个设备都有个网卡,数据就是从一个电脑的网卡发往另一个电脑的网卡。这个网卡地址就是所谓的MAC地址,每个网卡都有

2022-03-22 22:43:21 626

原创 面试题 分库分表、主从同步

二 系统

2022-03-03 16:55:16 722

原创 面试题四 如何设计一个高并发的架构系统

一、系统拆分使用dubbo、SpringCloud实现分布式,拆分系统,不同业务访问不同数据库二、缓存大量读请求直接从缓存里取三、MQ读请求解决好后,就要解决写请求,加入MQ进行削峰四、分库分表加入MQ可以针对平时数据量不大,但秒杀时数据量很大的场景,但如果平时数据量就很大,那MQ削峰了也没用。这时进行分库分表,将请求分摊到各个库五、读写分离要更新缓存中的数据,所以主库负责写,从库负责读六、ELK分布式系统上ELK七、简述阿里云ECS弹性伸缩,高峰特别是秒

2022-02-03 09:19:28 1487

原创 面试题三 分布式事务方案

一、两阶段提交1、介绍:有一个事务管理器的概念,负责协调多个数据库的事务,事务管理器先问各个数据库是否可以存储数据,如果都可以,那就正式提交事务,否则就回滚事务2、缺点:严重依赖数据库层面来搞定事务,效率很低,绝对不适合高并发的场景。在实际的分布式系统中,基本不可能使用。因为分布式服务中的每个服务按规定只能访问自己的库,所以没法使用两阶段提交二、TCC方案1、介绍:用业务代码实现分布式事务,TCC全称try、confirm、cancel1)try阶段:对各个服务的资源做检测和

2022-01-28 22:33:37 2004

原创 面试题二 分布式锁和分布式session

一、Zookeeper的作用1、分布式系统间的协调A系统发消息到MQ,并在zk的某个节点注册监听器,B系统消费后修改zk那个节点的值,A立马就可以收到通知2、分布式锁节点尝试创建临时的znode,创建成功了就获取锁。别的节点尝试获取锁,却获取不到,就对这个锁注册一个监听器,当原来的节点释放锁后,新的节点就会感知到,然后尝试重新获取锁3、注册中心、配置信息管理kafka、storm、dubbo选用zk做一些元数据、配置信息的管理4、HA高可用重要进程做主备两个机器,主机器挂了就

2022-01-26 17:00:13 2367

原创 《12个真实项目实战带你玩转Java并发编程》 笔记三 ThreadPoolExecutor与生产者消费者模式

一、第十三、十四课 两阶段终止模式既要保证线程灵活的切换运行状态,又要保证线程优雅的处理完当前任务,就是两阶段终止模式的核心思想两个阶段总结起来分别为:发出信号,告知正在运行的线程将被终止(通过volatile定义的bool变量实现) 接收到此信号的线程,做完善后工作,停止运行(比如把未处理完的数据写入持久化缓存,等待下次处理)二、第十五课 ThreadPoolExecutor的shutdown和shutdownNow两者都会尝试中止线程,但都只能中止阻塞状态的线程,正在运行的线程无法中

2021-12-27 14:25:42 357

原创 《12个真实项目实战带你玩转Java并发编程》 笔记五 ThreadLocal

一、ThreadLocal解密如果让我们自己实现ThreadLocal功能,我们第一反应想到的应该是这么做新建一个类名为MyThreadLocal 在类种创建一个Map类型的成员变量,key是Thread,value是Object但这样会有一个很严重的问题,内存泄漏。只要这个MyThreadLocal对象不回收,那Map中的对象也不会被回收,除非每次手动删除,但这样太麻烦了,一不注意就会导致OOM。所以这样设计是有很严重的缺陷的,那JDK中的ThreadLocal是如何是实现的呢?通过观察.

2021-12-23 17:21:10 605

原创 《12个真实项目实战带你玩转Java并发编程》 笔记四 FutureTask

一、第十六课Promise模式以烧水、泡茶这个过程举例,烧水耗时3分钟,泡茶耗时1分钟。用代码实现该功能,有下图所示的三种方式1)单线程模式,先烧水再泡茶,那么会耗时4分钟,即上图中第一行2)多线程模式,即最基础的Thread线程,烧水是一个线程,泡茶是一个线程,2个线程同时start,但这样的话主线程会很快结束,无法统计总共耗时,即上图中第二行3)使用FutureTask,烧水是一个FutureTask,喝茶是一个FutureTask,总共耗时3分钟,并且全部执行完后主线程才会结束..

2021-12-23 14:17:42 247

原创 《12个真实项目实战带你玩转Java并发编程》 笔记二 等待-通知机制

一、第九、十课 实现智能安防报警功能这2课主要介绍了通过Lock、Condition的await、singal方法来实现的“等待-通知”机制,具体要看文章中的代码。多线程编程之保护性暂挂模式_爱宝贝丶的博客-CSDN博客这篇博客和文章中的设计思路基本一样二、第十一课Guarded Suspension模式在BlockingQueue源码中的应用场景主要介绍了ArrayBlockingQueue的阻塞式的put和take方法。当队列满了后,put方法会触发notFull.await阻塞,直到...

2021-12-06 18:17:12 341

原创 《12个真实项目实战带你玩转Java并发编程》 笔记一 不可变类

一、第二课 解决并发问题的方法有哪些不可变对象:类似StringCAS原子类:如Atomic为前缀的一系列类二、第三课 如何快速实现一个不可变类1、使用final关键字修饰所有成员变量,避免其被修改,也可以保证多线程环境下被final关键字修饰的变量所引用的对象的初始化安全,即final修饰的字段在其他线程可见时,必定是初始化完成的。2、使用private修饰所有成员变量,可以防止子类及其他地方通过引用直接修改变量值。3、禁止提供修改内部状态的公开接口(比如我们前面例子中...

2021-11-30 10:10:38 464

原创 RocketMQ源码解读四 生产者发送数据

一、创建DefaultMQProducerImplDefaultMQProducer默认Topic是TBW102二、开始发送DefaultMQProducerImpl类,从namesrv获取Topic信息 private TopicPublishInfo tryToFindTopicPublishInfo(final String topic) { TopicPublishInfo topicPublishInfo = this.topicPublishInfoTab

2021-04-28 16:51:37 155

原创 SpringCloud refresh之finishBeanFactoryInitialization源码分析

一、整体流程首先进入preInstantiateSingletons方法,这段代码只需知道有mergedBeanDefinitions这个集合,它的key是beanName,value是RootBeanDefinition,其他部分源码都比较简单。大部分类最终都是进入了doGetBean方法 @Override public void preInstantiateSingletons() throws BeansException { if (logger.isTraceEnabled().

2021-03-09 15:09:51 157

原创 RocketMQ源码解读四 Broker写入数据

存储的核心逻辑是CommitLog类的asyncPutMessage方法,截取关键源码如下 public CompletableFuture<PutMessageResult> asyncPutMessage(final MessageExtBrokerInner msg) { /* * 删除了部分不重要的代码 */ putMessageLock.lock(); try { .

2021-03-05 17:06:12 323

原创 RocketMQ源码解读三 Broker启动篇

Broker的启动也和NameSrv一样,主要有createBrokerController和start这2个方法 public static void main(String[] args) { start(createBrokerController(args)); }createBrokerController方法源码如下,这边根据brokerRole的值,对brokerId和accessMessageInMemoryMaxRatio进行了特殊设置,暂不清楚这.

2021-03-01 15:17:46 375 1

原创 RocketMQ 源码解读二 NameSrv启动篇

NameSrv启动的main方法,核心就2个,createNamesrvController和start方法 public static NamesrvController main0(String[] args) { try { NamesrvController controller = createNamesrvController(args); start(controller); String .

2021-02-26 16:19:16 245 2

原创 RocketMQ 源码解读一 准备工作

一、启动nameser时报错Please set the ROCKETMQ_HOME variable in your environment to match the location of1、配置environment variable 配置name为 ROCKETMQ_HOME value为D:\Users\jackray\rocketmq\namesrv(rocketmq namesrv的源码路径)2、在namesrv文件根目录下创建conf、store、logs 目录,复制distribu

2021-02-26 14:57:07 163

原创 《从零开始带你成为消息中间件实战高手》 笔记一

一、第十五课 消息中间件的作用异步化提升性能、解耦、流量削峰二、第十七课 Kfaka、RabbitMQ、RocketMQ的比较三、第十九课 RocketMQ基本架构图

2021-02-23 15:20:41 513

原创 面试题一 消息中间件及缓存

一、缓存+数据库不一致解决方案初步方案:先删除缓存,再更新数据库。但这样在高并发下会有问题,比如线程A删除了缓存,正准备更新数据库,此时线程B需要查询数据,发现缓存里没有,就去数据库里查询并放入缓存。这样依旧会导致缓存与数据库不一致。进阶方案:将请求放入队列中,串行执行。比如一个更新请求,一个查询请求,都进入了队列中。更新请求先删缓存,再更新数据库,查询请求查数据库,再更新缓存。这样就能做到缓存与数据库一致。但效率不高,所以为了提高效率,不能所有的查询请求都入队列。最好是如果有更新请求进来了,就入.

2021-02-21 14:52:57 829

原创 《从零开始带你成为消息中间件实战高手》 笔记六

一、第七十八课 为什么基于RocketMQ进行订单库数据同步时消息会乱序场景:通过canal同步mysql数据,并把binlog消息放入RocketMQ,同步系统从MQ中同步消息写入别的库,实现数据同步问题:数据同步后,发现两边的数据不一致发生原因:比如有2条SQL,应该先insert,再update,结果同步时先update了,再insert,导致数据不一致底层原因:因为一个Topic可以指定多个MessageQueue,写入消息时,消息也会均匀分配给多个MessageQueue。所以可.

2021-02-18 11:38:53 376

原创 《从零开始带你成为消息中间件实战高手》 笔记五

一、第六十七课 从RocketMQ全链路分析为什么用户支付后没收到红包可能原因:1)订单系统推送消息到MQ失败2)MQ故障,丢失了os cache中的数据3)红包系统拿到了消息,却没有进行ACK,让MQ以为消费成功了二、第六十八课 发消息零丢失方案凭借RocketMQ自身的事务消息功能,可以保证推送出的消息一定会进入MQ中...

2021-02-17 11:01:17 365 1

原创 《从零开始带你成为消息中间件实战高手》 笔记四

一、第四十九课 生产者是如何发送消息的1、Topic、MessageQueue、Broker之间的关系一个Topic可以分布在多个Broker上,所以Topic的数据是分布式存储在多个Broker机器上的创建Topic的时候要指定MessageQueue的数量。MessageQueue是非常关键的一个数据分片机制,它将Topic的数据拆成了很多个数据分片,然后在每个Broker上存储了一些MessageQueue,通过这个方法,实现了Topic的分布式存储二、生产者写入生产者会从..

2021-02-13 13:47:37 1770 2

原创 《从零开始带你成为消息中间件实战高手》 笔记三

一、第三十七课 改造订单支付环节原来的架构图现在的架构图经过改造后,一旦支付成功,系统只需要更新订单状态+扣掉库存+发送订单消息到RocketMQ这三步就足够了,而积分、营销、推送、仓储等系统则从MQ中消费信息我们部署的2台Master Broker,Topic数据会分散在这2个Master Broker上。因此当我们往Topic发送订单数据,会根据一定的算法把消息发送到一个Broker上二、第三十九课 RocketMQ的发送方式和消费模式1、发送消息的方式1)同步发..

2021-02-10 10:15:55 312 1

原创 《从零开始带你成为消息中间件实战高手》 笔记二

一、RocketMQ架构图二、第三十一课 对OS内核和JVM参数调整1、对RocketMQ集群进行OS内核参数调整1)vm.overcommit_memory有0、1、2三个值可选0:在中间件申请内存时,os内核会检查可用内存是否足够,如果足够就分配内存给你,如果不太够,就拒绝分配内存,导致中间件报错(一般不设置0) 1:把所有可用的内存都允许分配给中间件(一般设置为1) 2:内核允许分配超过所有物理内存和交换空间总和的内存(一般不设置2)2)vm.max_map_coun..

2021-02-09 10:29:56 290

原创 DBLE整体流程图

public void startup() throws Exception { LOGGER.info("===========================================DBLE SERVER STARTING==================================="); // 读取db.xml、user.xml、sharding.xml的配置信息并封装到实体类 this.config = new ServerC...

2021-01-14 15:30:02 118

原创 《从零开始带你成为JVM实战高手》 笔记八

一、常见导致OOM的原因1、递归、循环调用导致虚拟机栈内存溢出举例:找出D盘下文件名中含有txt的文件,D盘下有很多文件夹,每个文件夹下又有很多文件夹,如果使用递归可能导致栈溢出,如何解决?2、 堆内存放不下过多对象...

2020-10-14 10:59:13 333 1

原创 《从零开始带你成为JVM实战高手》 笔记七

一、第五十课 jstat指令1、命令jstat -gc [PID] 间隔时间 次数 每隔多少时间打印一次JVM内存状况,总共打印指定次数二、第五十一课 jmap、jhat指令分析大对象1、使用jmapjmap -dump:live,format=b,file=dump.hprof [PID] 将堆内存快照放到dump.hprof文件中,这个是二进制文件,不能直接打开2、使用jhatjhat dump.hprof -port 7000 启动jhat服务器,指...

2020-10-14 10:54:36 302

原创 《从零开始带你成为JVM实战高手》 笔记六

一、第四十三课 模拟young gc编写测试代码 public static void main(String[] args) { byte[] array1 = new byte[1024 * 1024]; array1 = new byte[1024 * 1024]; array1 = new byte[1024 * 1024]; array1 = null; byte[] array2 = new byte[1024 * 1024 * 2]; }设置JV

2020-10-07 17:33:27 302

原创 《从零开始带你成为JVM实战高手》 笔记五

一、第二十九课 G1收集器简介1、可以同时回收新生代和老年代。将Java堆内存拆分成多个大小相等的Region,G1页也有新生代和老年代的概念,不过是逻辑上的概念。也就是说,一个Region可以先作为新生代,在被回收后,又作为老年代了2、设置垃圾回收的预期停顿时间比如可以指定,G1垃圾回收时,在1小时内由于回收导致的Stop the World不超过1分钟3、G1会追踪每个Region里的回收价值即每个Region中的内存大小,回收它们要多少时间,以此在垃圾回收时进行控制,这就是G.

2020-10-04 13:48:07 205

原创 《从零开始带你成为JVM实战高手》 笔记四

一、第二十二课 ParNew工作机制

2020-10-03 16:06:07 311

原创 《从零开始带你成为JVM实战高手》 笔记三

一、第十五课 JVM中的对象什么情况下会被回收1、可达性算法对每个对象分析有谁在引用,然后一层一层往上判断,看是否有一个GC Roots。一般将局部变量和静态变量看作GC Roots,即只要对象被方法的局部变量、类的静态变量引用了,就不会回收它们2、引用类型强引用:绝对不会被垃圾回收 软引用:正常的垃圾回收后内存还是不够,就会回收软引用 弱引用 :发生垃圾回收,就会被回收3、finalize一个对象要被回收时,还是可以拯救的。可以通过重写Object类的finalize方法,让某个

2020-10-02 22:44:07 209

原创 《从零开始带你成为JVM实战高手》 笔记二

一、第八课 聊聊年轻代、老年代年轻代:创建和使用完后立马就要回收的对象放在里面老年代:需要一直存在的对象放在里面如图所示思考题问题:方法区内会不会进行垃圾回收回答:在以下几种情况下,方法区里的类会被回收1)首先该类的所有实例对象都已经被回收2)加载这个类的classloader已经被回收3)对该类的class对象没有任何引用二、第九课 对象在JVM内存中如何分配如果一个实例对象在新生代中,成功的在15次垃圾回收之后,还没被回收掉,就会被转移到老年代中总

2020-10-01 15:12:23 255

原创 《从零开始带你成为JVM实战高手》 笔记一

一、Java是如何运行起来的写好的java文件会被编译成class文件,类加载器会将class类加载到JVM中,JVM会基于自己的字节码执行引擎,来执行加载到内存中的那些类二、JVM的类加载机制1、类加载过程一个类从加载到使用会经历下面的这个过程加载、验证、准备、解析、初始化、使用、卸载验证阶段:校验加载进来的class文件是否符合规范准备阶段:给加载进来的类分配内存空间、类变量(static修饰的)分配内存空间、赋予初始值准备阶段给类变量赋值,只会赋予初始值,例如p..

2020-09-20 19:33:52 448

原创 XXL-JOB研究二 调度中心

111

2020-08-29 21:49:47 689

空空如也

空空如也

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

TA关注的人

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