- 博客(61)
- 收藏
- 关注
原创 MySQL - Innodb索引
1.前提在学习Innodb存储引擎的索引原理之前,需要先搞明白B+树,如果数据结构比较薄弱,需要从以下几个树开始。二叉搜索树,https://blog.csdn.net/qq_28958301/article/details/91590545 二叉平衡树,AVL,https://blog.csdn.net/bjweimengshu/article/details/106774187 红黑树,https://blog.csdn.net/bjweimengshu/article/details/10
2020-07-07 16:51:41 547
原创 MySQL系列 - 初步认识InnoDB存储引擎
1.InnoDB引擎简单介绍InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是MySql默认的存储引擎。InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE(不可重复读)级别。引出第一个问题:什么是MVVC ? (后面回答,埋下伏笔)..
2020-07-06 18:57:18 258
原创 数据结构与算法系列 - 时间复杂度分析
什么是复杂度分析? 数据结构和算法,本身是让计算机,即快又省。 执行效率是是一个非常重要的考量指标,需要从时间维度和空间维度来评估数据结构和算法性能。 分别用时间复杂度和空间复杂度来描述性能问题,二者统称为复杂度。 为什么要进行复杂度分析? 复杂度分析,不依赖硬件的具体的环境。 测试结果不受数据规模大小的影响。 复杂度分析之时间复杂度定义:时间复杂度的全称是 渐进时间复杂度, 表示算法的执行时间与数据规模之间的增长关系。大O复杂度分析法例子1:
2020-06-28 20:46:54 611
原创 JVM虚拟机系列 - 常用JVM命令和工具(网上汇总集锦)
通过案例切入1.CPU百分比怎么定位?可以使用arthas去定位。通过在dashboard界面,就可以看出那个线程占用cpu的比比较高,所以这里线程的名字一定要有意义。假如说是gc线程,那么可能是gc出了问题,要去观察gc日志,看是不是full gc。如果是业务线程,可以通过thread命令,thread指定线程ID,查看线程堆栈,根据堆栈信息,再进一步定位代码。2.频繁FGC怎么定位?可以通过jmap命令定位,命令列表:https://www.cnblogs.com/k
2020-06-27 16:48:27 202
原创 JVM虚拟机系列 - 垃圾收集器机制
背景分析垃圾收集器,主要从以下几个方面入手:1)什么是垃圾,什么样的对象要被回收?2)如何定位垃圾?3)垃圾清除算法4)经典垃圾收集器1.什么是垃圾?通俗来说:一个对象没有任何引用指向它,这样的对象就是垃圾。2.如何定位垃圾?1.引用计数法在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。缺陷:无法解决循环引用的问题。如下图:A,B,C三个对象互相持有对方
2020-06-26 21:59:13 877 1
原创 JVM虚拟机系列 - classloader机制
什么是类加载器?通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性。类相等机制?相等的规则:这里所指的“相等”,包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果,也包括了使用instanceof关键字
2020-06-25 18:32:03 172
原创 JVM虚拟机系列 - 基础知识之Java运行时区域&&HotSpot内部对象解密
背景要想学懂JVM,必须先搞清楚JVM的基础知识,基础知识从《深入理解Java虚拟机,第三版》整理而来,通过思维导图的方式更加清晰。思维导图
2020-06-25 15:12:29 157
原创 Java并发系列 - CAS,锁升级,synchronized
CAS想要详细的了解cas,需要分别从是什么,什么用,以及实现原理三个方面入手,最后再去看cas在jdk并发包中的实践。CAS详解cas是compare and swap的缩写,比较并交换。cas在java内定义是自旋锁,自旋锁是一种比较轻量级的锁。cas自旋锁实现的整体流程:举个例子:假如说,现在要利用cas计算x = 0; x+1这个操作。这个操作会有多个线程并发访问,如果不加锁,最终的计算结果肯定是错误的,所以这里可以使用cas自旋锁去计算。整体流程如下:1)先把x=0
2020-06-23 22:58:32 746
原创 Java并发系列 - 详解Volatile
Volatile是我们在并发编程中经常会碰到的关键字。关于volatile的文章,网上已经非常多了。本文开门见山,结合底层原理以及实际使用场景,分别从以下几个维度,深入剖析volatile关键字。1)作用2)实现原理3)实际案例4)JMM中与Volatile相关的内容作用1) 可见性。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。被volatile修饰的变量具有可见性。2)禁用指令重排序。重排序:CPU会对指令进行重排序优化,假如说有,x=1,y
2020-06-18 23:28:10 202
原创 Redis系列 - 持久化机制探究
背景Redis的数据都在内存里面,如果服务突然宕机,数据岂不是全丢了,别慌,Redis通过了持久化机制来保证数据不丢失。Redis的持久化集中制包括:1)RDB 2)AOF 3)混合持久化。混合持久化是从Redis4.0开始支持。RDB方式什么是rdb持久化,rdb持久化可以理解为在某个时间点对所有数据做一次快照。触发RDB的方式?1)通过修改redis配置文件。SAVE 900 1 代表900秒内有一条命令写入就执行快照。SAVE 300 10 代表300秒内有十条命令..
2020-06-13 15:37:39 583
原创 Redis系列 - Redis基础数据结构
Redis安装Window安装Redis只能安装3.x的低版本,最新的6.x根本无法尝鲜。从知乎的一个帖子得知可以在win10开启linux子系统支持来安装Linux,然后再安装Redis。注意不是虚拟机的模式,子系统要比虚拟机轻量的多。具体过程:1) 完成win10的linux子系统Ubuntu的安装,具体步骤参考:https://zhuanlan.zhihu.com/p/563745342)在win10运行Ubuntu,然后安装redis。采用的是从redis官网下载安装包,自己编译安装
2020-06-12 19:03:14 238
原创 Zookeeper系列 - Zab选举简单分析
什么是Zab协议定义:ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeeper Atomic Broadcast(ZAB,ZooKeeper原子消息广播协议)的协议作为其数据一致性的核心算法。ZAB协议并不像Paxos算法那样,是一种通用的分布式一致性算法,它是一种特别为ZooKeeper设计的崩溃可恢复的原子消息广播算法。作用:在ZooKeeper中,主要依赖ZAB协议来实现分布式数据一致性,基于该协议,ZooKeeper实现了一种主备模式的系统架构来保持集群中
2020-06-10 21:07:41 323
原创 Zookeeper系列 - Leader选举
前置准备为了彻底搞懂zk选举leader的过程,需要在windows本地搭建一个伪集群出来,通过实际操作,观察集群的节点的变化。但是在实操过程中,发现windows搭建的一些坑,这记录下。伪集群搭建步骤1.参考此博客进行搭建,https://www.cnblogs.com/qlqwjy/p/10491456.html2.依次启动,启动后,无法使用zkServer.cmd status命令,无法观察哪一个节点是leader,各种查阅后,发现zkServer.cmd在windows上就是用不了,
2020-06-08 22:55:21 1013
原创 Zookeeper系列 - 利用ZK实现分布式锁
背景在微服务的场景中,经常会遇到需要分布式锁的场景,至于说分布式锁的实现,常见的有两种,1)Redis 2)Zookeeper,其实现各有优缺点。Redis实现优点:性能好,调用RT短。 实现简单,基于setnx命令与expire命令即可。Redis实现缺点:expire过期时间不好控制。 假如redis服务宕机,会造成锁释放不了,从而死锁。Zookeeper实现优点:不会死锁,采用临时节点,zk宕机后,临时节点即自动断开。 通过友好的设计,可避免zk的羊群效应。Zookee
2020-06-07 12:46:07 410 1
原创 Dubbo系列 - 整体架构
架构概览 Provider导出一个服务,这个服务就是可被调用的; 第二步,往注册中心注册这个服务; Consumer 这端会来订阅相关的服务,如果注册中心里面,Provider 列表有变化的话,它也会得到通知; Consumer 会根据一定的路由规则从注册中心拿到 Provider 列表,再根据一定的负载均衡策略,精确地调用到某台 Provider 上去。 问题或改进点案例在杭州有一家中等规模的电商公司,公司内部有 4000+ 个服务,以 Zookee
2020-06-04 21:13:41 223
原创 Kafka系列 - 深入探究broker
1.背景主要从控制器、consumer主题管理、kafka的副本机制三个方面对broker进行深入研究,梳理清楚broker端的一些基础流程。2.控制器控制器的作用?在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器(KafkaController)。1.管理整个集群中所有分区和副本的状态。比如:某分区leader副本出现故障,控制器为该分区选举leader副本。ISR发生变化,控制器通知所有broker更新元数据。2.控制器负责分区的重新
2020-05-30 17:31:56 963 1
原创 Kafka系列 - 深入探究-生产者与消费者
1.背景kafka三端深入,三端是我自己定义的,即:生产者,消费者,broker。这里主要围绕三端展开一些原理性的深入研究。主要内容如下:2.生产者2.1 代码实践
2020-05-28 21:43:34 474
原创 Kafka系列 - kafka基础认知
kafka是什么?kafka是一个分布式的,基于发布、订阅的消息系统。目前主流互联网公司都在使用kafka,常见的一些使用场景:实时计算、实时推荐、实时风控、埋点监控等。所有的这些业务场景,都依赖kafka作为中间的一个消息系统,比如:数据从mysql binlog日志经过kafka,再到flink计算引擎,数据从logtail日志采集客户端,经过kafka,再到下游业务系统进行埋点处理。为何这么多业务场景都偏爱kafka?其本质原因是:削峰填谷。防了防止大的流量直接让下游应用雪崩,那么为何选择ka
2020-05-23 11:39:38 421 1
原创 Spring Aop - Transactional注解原理深入剖析-第九篇
在研究Spring Aop Transaction之前,阅读了其他同学写的csdn的文章,这些文章对于事物切面执行的逻辑剖析的非常详细。但是我始终有一个疑问,就是我写了一个Service,是在什么阶段,通过Spring的哪个拓展点,生成的事物对象,翻阅了很多人的文章,始终没有找到满意答案,自己做了个Demo,从头到尾Debug了几遍,终于搞清楚了,瞬间豁然开朗。主要是从三个大的方面按照顺序去剖析:1.Spring tx包内的自定义标签解析。2.生成事物代理对象的过程。3.事物真正执行的过程。实际例子.
2020-05-19 21:13:13 608 1
原创 Spring Aop - 使用ProxyFactoryBean实现Aop原理-第八篇
概述使用ProxyFactoryBean来演示如何生成一个代理对象,并执行aop的过程,ProxyFactoryBean即前文交待的FactoryBean的子类,这里可以再回忆下FactoryBean与BeanFactory的区别,具体文章:https://blog.csdn.net/y510662669/article/details/105664281ProxyFactoryBean见文知意,即用来生成代理的工厂bean。生成的bean是一个代理bean。类结构ProxyConfig
2020-05-11 23:34:40 812
原创 Spring Aop - Aop概念以及代理模式-第七篇
什么是Aop?AOP是Aspect-Oriented Programming(面向方面编程或面向切面)的简称,最主要的是从业务代码中找到关键的关注点,并分离关注点,使解决特定领域问题(日志,监控)的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过切面来封装、维护,这样原本分散在整个应用程序中的变动就可以很好地管理起来。Aop相关...
2020-05-09 18:34:35 174
原创 Spring IOC-Bean加载过程-第六篇
Bean加载时机Spring 容器内的Bean是在什么时候加载的呢?在Spring内有一个配置可以管控Bean加载的时机,即Lazy-init,在绝大多数情况下,通常这个配置是false。把懒加载置为false的原因,是希望在Spring Ioc容器初始化的时候,就把所有的Bean都给初始化好。这样可以缩短系统接口的RT。对lazy-init属性的处理,实际的处理是在DefaultListab...
2020-05-06 21:45:18 308
原创 领域驱动设计-读书笔记-第十七章-领域驱动设计的综合应用
战略设计如何设计战略,在大型的复杂的系统中,需要综合运用几种策略,大型结构如何与Context Map共存,应该把构造块放到哪里?步骤怎么设计?基本指导思路战略设计三个基本原则,上下文,精炼和大型结构,三者互为补充。指导步骤当对一个项目进行战略设计时,首先需要清晰地评估现状。画出CONTEXT MAP。你能画出一个一致的图吗?有没有一些模棱两可的情况? 注意项目上的语...
2020-05-04 19:25:30 309
原创 领域驱动设计-读书笔记-第十六章-大型结构
复杂系统面临的真实问题背景硅谷一家小设计公司签了一份为卫星通信系统创建模拟器的合同。工作进展得很顺利,他们正在利用MODEL-DRIVEN DESIG来进行开发。为了澄清模型中的复杂关系,他们已经把设计分解为一些在规模上便于管理的内聚MODULE,于是现在便有了的很多MODULE。问题在这种情况下,开发人员要想查找某个功能,应该到哪个MODULE中去查呢?如果有了一个新类,应该...
2020-05-03 12:16:17 862
原创 领域驱动设计-读书笔记-第十五章-精炼
什么是精炼?上面这4个方程式,再加上其中的术语定义,以及它们所依赖的数学体系,表达了19世纪经典电磁学的全部内涵。如何才能专注于核心问题而不被大量的次要问题淹没呢?LAYEREDARCHITECTURE可以把领域概念从技术逻辑中(技术逻辑确保了计算机系统能够运转)分离出来,但在大型系统中,即使领域被分离出来,它的复杂性也可能仍然难以管理。精炼是把一堆混杂在一起的组件分开的过程,以便通过...
2020-05-02 15:21:39 735
原创 Spring IOC-Spring循环依赖解决方案-第五篇
什么是循环依赖?目前,在我司是大力推行微服务之间消除循环。即应用A依赖B,B也依赖A。目前消除应用间的循环依赖,除了从业务和功能上去梳理合理性之外,此外还比较倡导应用下沉,即梳理出应用最核心的一部分职责或者功能,下沉到单独的一个应用。例如:A应用通过梳理后,下沉能力沉淀出应用C,那么这个时候依赖结构就变成了:A应用依赖C,B应用也依赖C,C应用是独立的。即通过引入一个新的应用,来解决循环依赖...
2020-04-28 22:33:45 502
原创 领域驱动设计-读书笔记-第十四章-保持模型的完整性
通过一个案例引入案例:客户发票系统共用了一个charge对象,引发了bug。问题在于这两个团队使用了不同的模型,而他们并没有认识到这一点,也没有用于检测这一问题的过程。每个团队都对Charge对象的特性做了一些假设,使之能够在自己的上下文中使用(一个是向客户收费,另一个是向供应商付款)。当他们的代码被组合到一起而没有消除这些矛盾时,结果就产生了不可靠的软件。如果他们一开始就意识到这一点...
2020-04-27 17:43:26 711
原创 Spring IOC-Spring扩展点大集合-第四篇
Spring是一个非常优秀的框架,其拓展点非常多,可以自定义很多功能。很多框架都采用了Spring的拓展点,例如:Dubbo,DisConf,Mybatis等。目前先梳理下Ioc部分的拓展点,文章部分内容参考:https://blog.gavinzh.com/2017/11/20/spring-develop-summary/,同时结合自己研读的源码,综合整理而来。此外,Aop部分的拓展点也很多...
2020-04-26 14:31:58 458
原创 Spring IOC-源码解读FactoryBean-第三篇
什么是FactoryBeanFactoryBean见文知意,本身是一个Bean,可以用来生成对象或者修饰对象的工厂Bean。FactoryBean可以在容器中注册两个Bean,一个是FactoryBean本身,一个是FactoryBean通过调用getObject获得的Bean。如果想在容器中获取,FactoryBean本身,需要添加&符合,例如:getBean("$factoryBe...
2020-04-21 22:13:31 364
原创 Spring IOC-源码解读BeanFatory与ApplicationContext-第二篇
接上一篇文章,上一篇重点讲了Spring ioc容器的核心类和整体的体系架构。ioc容器内其实有两大设计主线,一个是BeanFactory一个是ApplicationContext。本章,重点对这两大设计主线进行一探究竟,主要从以下几个维度出发: BeanFactory与ApplicationContext的应用场景,以及实现原理。 BeanFactory与ApplicationC...
2020-04-21 11:24:09 178
原创 规则引擎系列—规则引擎背后的算法
1.算法简介目前,业界主流的规则引擎使用的算法,都是RETE算法。什么是RETE算法呢,以下算法的定义,是从其他官方博客摘抄而来,同时加入了自己的理解。Rete 算法最初是由卡内基梅隆大学的 Charles L.Forgy 博士在 1974 年发表的论文中所阐述的算法 , 该算法提供了专家系统的一个高效实现。自 Rete 算法提出以后 , 它就被用到一些大型的规则系统中 , 像 ILog、...
2020-04-19 16:22:19 6551 1
原创 领域驱动设计-读书笔记-第十三章-通过重构得到更深次的理解
注意事项通过重构,可以得到深层次领域模型或者理解的,三点注意事项:(1) 以领域为本; (2) 用一种不同的方式来看待事物; (3) 始终坚持与领域专家对话。何时开始重构?与传统重构观点不同的是,即使在代码看上去很整洁的时候也可能需要重构,原因是模型的语言没有与领域专家保持一致,或者新需求不能被自然地添加到模型中。重构的原因也可能来自学习:当开发人员通过...
2020-04-18 15:25:59 258
原创 领域驱动设计-读书笔记-第十二章-将设计模式应用于模型
区别设计模式与领域模式之间的区别?设计模式可以认为是对一些交互的对象和类的描述,我们通过定制这些对象和类来解决特定上下文中的设计问题。《设计模式》中的设计模式把相关设计元素归为一类,这些元素能够解决在各种上下文中经常遇到的问题。这些模式的动机以及模式本身都是从纯技术角度描述的。但这些元素中的一部分在更广泛的领域和设计上下文中也适用,因为这些元素所对应的基本概念在很多领域中都会出现。策略...
2020-04-18 14:52:24 291
原创 领域驱动设计-读书笔记-第十一章-应用分析模式
定义分析模式是一种概念集合,用来表示业务建模中的常见结构。它可能只与一个领域有关,也可能跨越多个领域。分析模式”这个名字本身就强调了其概念本质。分析模式并不是技术解决方案,他们只是些参考,用来指导人们设计特定领域中的模型。作用分析模式的最大作用是借鉴其他项目的经验,把那些项目中有关设计方向和实现结果的广泛讨论与当前模型的理解结合起来。脱离具体的上下文来讨论模型思想不但难以落地,而且还...
2020-04-17 15:22:42 397
原创 领域驱动设计-读书笔记-第十章-柔性设计
什么是柔性设计?为了使项目能够随着开发工作的进行加速前进,而不会由于它自己的老化停滞不前,设计必须要让人们乐于使用,而且易于做出修改。这就是柔性设计(supple design)。作用柔性设计是对深层建模的补充。一旦我们挖掘出隐式概念,并把它们显示地表达出来之后,就有了原料。通过迭代循环,我们可以把这些原料打造成有用的形式:建立的模型能够简单而清晰地捕获主要关注点;其设计可以让客户开发...
2020-04-17 11:34:25 763
原创 领域驱动设计-读书笔记-第九章-将隐形概念转变为显性概念
背景以及问题什么是深层建模?深层建模包含了领域的核心概念,能够以最灵活简单的方式呈现出解决方案。深层建模第一步是要设法在模型中表达出领域的基本概念,随后在不断消化知识和重构过程中,实现模型的精化。如何实现深层建模呢?这是个比较大的话题。但是,一般开始深层建模的征兆是:我们可以识别出某个重要概念并且在模型把它显示的表达出来。概念挖掘示例:听出运输模型中缺失的概念例子:团队已经...
2020-04-16 11:41:07 404
原创 规则引擎系列—初识规则引擎
什么是规则引擎规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。这是来自百度百科的解释。本质上规则引擎,是为了解决复杂业务规则决策,将复杂多变的业务规则,从代码内提炼出来,抽象为dsl语言或者可视化界面配置,用户角色:运营/产品/开发,可以动态调整d...
2020-04-15 20:24:18 1648
原创 Spring IOC-源码解读-第一篇
Spring IOC源码解读,重点围绕以下几部分去探究Spring IOC源码的秘密,分别是:Spring Ioc 容器是什么?作用有哪些?整体架构是如何组成的?整个体系结构由哪些核心类组成? Spring Ioc 容器内的两条设计主线,BeanFactory设计主线,ApplicationContext设计主线,以及它们的设计原理和对应的应用场景,还有彼此之间的区别。 IOC容器的初始化...
2020-04-12 16:40:20 192
原创 领域驱动设计-读书笔记-第八章-突破
本章,重点通过作者举实际例子,说明是如何一步步从小的领域模型改动,突破到大的领域模型改动,并带来的收益和成本。突破与时间/价值的趋势图:需求:假如Intel想要建造一座价值10亿美元的工厂,就需要申请贷款,但贷款的额度太大,以至于任何一家借贷公司(lending company)都无法独立承担,于是这些公司就组成银团[2],集中它们的资源,以此来支持这种巨额信贷。投资银行通常在银...
2020-04-11 11:46:53 299
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人