- 博客(208)
- 收藏
- 关注
原创 nacos配置中心源码分析
这个里面先查出mysql最大的主键量,然后分页每次1000条写入磁盘和内存ConfigCacheService.dump(cf.getDataId(),cf.getGroup(),cf.getTenant(),cf.getContent(),cf.getLastModified(),cf.getType());触发本地文件和内存的更新。其中RefreshScopeRefreshedEvent是一个留给我们的扩展点,我们可以自己去监听这个变更的事件,这里没有实现这个类的监听。............
2022-07-21 17:18:06
1457
1
原创 三地五中心(ldc(逻辑数据中心)单元化)和容灾
LDC的全称为LogicDataCenter,逻辑数据中心,之所以叫LDC,是跟传统的IDC(InternetDataCenter)相比而提出来的概念。IDC相信大家都很清楚,就是物理的数据中心,说白了就是能够建站的物理机房。LDC(逻辑数据中心),核心架构思想就是不管你物理机房部署是怎样的,比如你可能有三个IDC,分别在二个不同城市(常说的两地三中心),在逻辑上是统一的,我逻辑上看成一个整体,统一协调调配。三地五中心,每个中心都是单元化架构,独立的,没有灾备(灾备的话再下面三地五中心的灾备里面会讲。...
2022-07-15 16:52:16
10676
1
原创 两地三中心及其灾备
单机房架构单机房 是指只有一个生产数据中心,当出现自然灾害等原因而发生故障时,应用和数据不具备容灾能力。所以演变出了下面的两地三中心架构一般两地三中心可以达到4个9的可用性:也就是一年中只有一个小时服务断续不可用完全独立的三个中心,都可以当生产中心使用同城双中心 :是指在同城或邻近城市建立两个可独立承担关键系统运行的数据中心,双中心具备基本等同的业务处理能力并通过高速链路实时同步数据,日常情况下可同时分担业务及管理系统的运行,并可切换运行; 异地灾备中心: 是指在异地的城市建立一个备份的灾备中
2022-07-14 20:05:26
7272
原创 深入liunx内核理解epoll
Linux网络IO模型同步和异步,阻塞和非阻塞同步和异步关注的是调用方是否主动获取结果同步:同步的意思就是调用方需要主动等待结果的返回异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函数等。阻塞和非阻塞主要关注的是等待结果返回调用方的状态阻塞:是指结果返回之前,当前线程被挂起,不做任何事非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。......
2022-07-04 16:35:09
440
1
原创 ddia数据密集型应用系统设计 整理
推特用户发送推文,关注者接受推送消息,采用了混合方案的思想(p19)人多的(超级大V)那种采用关系型数据模型来支持时间线(类似的,推文单独提取,读取的时候才和用户的时间线主表合并),人少的用户关注者采用数据流水线方式推送。延迟和响应时间:响应时间=网络传输时间+应用延迟时间前者是指数据(包括请求数据和响应数据)在客户端和服务器端进行传输的时间,而后者是指网站软件实际处理请求所需的时间。类似的,软件性能测试也更关心“应用延迟时间”。一般至少关注p90或者p95即以上指标性能,响应时
2022-06-21 17:13:36
622
原创 redis 分布式锁整理
上面这种写法是有问题的redis设置分布式锁 同时设置超时时间 不能分开写 原子操作才行 ,否则 挂掉会有问题就是说第一行设置完分布式锁的key,第二行设置超时时间的,那么如果在第一行和第二行之间服务器挂掉了就会有问题。下图这种设置超时时间也是有问题的:因为是固定的十秒钟,那么存在这种情况:1.线程一运行了15秒钟,但是锁设置的是十秒钟,那么这时候线程二在线程一运行代码的时候同时加锁运行了,然后线程一在线程二运行五秒钟的时候(也就是线程一的第15秒把锁删除了,这时候...
2022-06-20 16:38:56
757
转载 Longaddr和ThreadLocalRandom
高并发下计数功能最好的数据结构就是LongAdder与DoubleAdder,低并发下效率也非常优秀,这是我见过的java并发包中设计的最为巧妙的类,从软硬件方面将java并发累加操作优化到了极致,所以应该我们应该弄清楚它的每一行代码为什么要这样做,它俩的实现大同小异,下面以LongAdder类为例介绍下它的实现。Striped64类public class LongAdder extends Striped64 implements SerializableLongAdder继承了Strip
2022-05-23 17:05:56
341
原创 深入理解网络通信与tcp/ip协议
计算机网络发展简史1、诞生阶段,20世纪60年代中期之前的第一代计算机网络是以单个计算机为中心的远程联机系统。2、ARPANET,多个主机通过通信线路互联起来。60年代初。当时,美国国防部为了保证美国本土防卫力量和海外防御武装在受到前苏联第一次核打击以后仍然具有一定的生存和反击能力,认为有必要设计出一种分散的指挥系统;它由一个个分散的指挥点组成,当部分指挥点被摧毁后,其它点仍能正常工作,并且在这些点之间能够绕过那些已被摧毁的指挥点而继续保持联系。这个设计出发点很重要,理解了它,就能够理解为何后面要学
2022-04-11 16:48:32
2725
原创 redis集群运维与核心原理剖析
Redis集群方案比较在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率高可用集群模式redis集群是一个..
2022-04-06 17:38:01
211
原创 ShardingJDBC核心概念与快速实战
一、ShardingSphere 二、ShardingJDBC实战 1、核心概念: 2、测试项目介绍 3、快速实战 4、ShardingJDBC的分片算法 5、ShardingSphere的SQL使用限制 6、分库分表带来的问题 7、分库分表方案设计实战 一、ShardingSphere ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮,带.
2022-03-29 14:16:16
540
原创 redis高级数据结构hyperLogLog和redis 7.0
HyperLogLog(Hyper[ˈhaɪpə(r)])并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。(存储的统计是去重的) (目的就是在一定的误差范围内,用最小的空间复杂度来估算一个数据流的基数。)如果你负责开发维护一个大型的网站,有一天产品经理要网站每个网页每天的UV 数据,然后让你来开发这个统计模块,你会如何实现?如果统计PV 那非常好办,给每个网页一个独立的Redi
2022-03-14 16:47:04
2356
原创 字符串匹配算法BF,BM,KMP
字符串匹配bf算法:(暴力穷举算法)在一个字符串中寻找另一字符串,最容易想到的,也是最简单的办法是:取主串和模式串/搜索串中的每一位依次比较,如果匹配则同时后移一位继续比较,直至匹配到模式串的最后一位;如果出现不匹配的字符,则模式串向后移动一位,继续比较。这种解决问题的思路简单暴力,也是这个算法被叫做BF(Brute Force)的原因。整个匹配的过程可以参考下图,我们假设主串为“abdea”,搜索串为“dea”:这个算法的复杂度还是比较好分析的,我们假设主串的长度是 m,模式串的...
2022-03-08 16:13:56
1332
转载 Floyd判圈算法理解 快慢指针
关于该算法,wiki上有详细说明。https://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_harehttps://zh.wikipedia.org/wiki/Floyd%E5%88%A4%E5%9C%88%E7%AE%97%E6%B3%95Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm)。该算法由美国科学家罗伯特·弗洛伊德发明
2022-02-16 23:54:51
178
原创 JIT深度剖析
跨语言(语言无关性):JVM只识别字节码,所以JVM其实跟语言是解耦的,也就是没有直接关联,JVM运行不是翻译Java文件,而是识别class文件,这个一般称之为字节码。还有像Groovy 、Kotlin、Scala等等语言,它们其实也是编译成字节码,所以它们也可以在JVM上面跑,这个就是JVM的跨语言特征。Java的跨语言性一定程度上奠定了非常强大的java语言生态圈。解释执行与JITJava程序在运行的时候,主要就是执行字节码指令,一般这些指令会按照顺序解释执行,这种就是解释执行。
2022-02-14 16:09:30
1193
转载 Quorum机制
WARO协议是一种简单的副本控制协议,当 Client 请求向某副本写数据时(更新数据),只有当所有的副本都更新成功之后,这次写操作才算成功,否则视为失败。这样的话,只需要读任何一个副本上的数据即可。但是WARO带来的影响是写服务的可用性较低,因为只要有一个副本更新失败,此次写操作就视为失败了。从这里可以看出两点:①写操作很脆弱,因为只要有一个副本更新失败,此次写操作就视为失败了。②读操作很简单,因为,所有的副本更新成功,才视为更新成功,从而保证所有的副本一致。这样,只需要读任何一个副本上的数据即可
2022-01-20 18:04:24
507
转载 时间轮算法介绍
时间轮TimeWheel算法想象这样一种情况,业务中要求提交定时任务,一种实现是提交任务后启动一个定时线程,轮训检测该任务,当任务量变的庞大的时候,这种开销是可怕的,令一种实现是将所有任务有些组织,只用一个线程就可以控制所有的定时任务,时间轮算法就是这种实现,netty、kafka、zookeeper中都使用了该算法实现延时处理。时间轮如图所示,图中0~8代表时间周期,每个时间节点代表一个小的时间间隔,假设时间间隔为1分钟,则图中每个时间节点中将包含在这一分钟内的所有定时任务,存储为一个双向的li.
2022-01-18 16:42:42
892
原创 tomcat类加载和热部署热加载相关
Tomcat类加载机制JVM类加载器Java中有 3 个类加载器,另外你也可以自定义类加载器BootstrapClassLoader 是启动类加载器,由 C 语言实现,用来加载 JVM 启动时所需要的核心类,比如rt.jar。 ExtClassLoader 是扩展类加载器,用来加载\jre\lib\ext目录下 JAR 包。扩展加载器的 #getParent() 方法返回 null ,但实际上扩展类加载器的父类加载器就是启动类加载器。 AppClassLoader 是系统类加载器,用来加
2022-01-14 14:58:54
372
1
原创 tomcat整体架构(补充下Servlet规范)
Servlet规范思考:1. 浏览器发送http请求,http服务器如何知道这个请求应该交给哪个Java类处理呢?图的左边表示 HTTP 服务器直接调用具体业务类,它们是紧耦合的。再看图的右边,HTTP 服务器不直接调用业务类,而是把请求交给容器来处理,容器通过 Servlet 接口调用业务类。因此 Servlet 接口和 Servlet 容器的出现,达到了 HTTP 服务器与业务类解耦的目的。而 Servlet 接口和 Servlet 容器这一整套规范叫作 Servle...
2022-01-11 14:04:12
305
原创 InnoDB引擎底层事务的原理
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。原子性指的是一个事务中的操作要么全部成功,要么全部失败。一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱,假设中间sql执行过程中系统崩溃A也不会损失100块,因为事务没有提交,修改也就不会保存到数据库。隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。总的来说,MySQL中事务的原子性是
2022-01-04 14:18:07
2058
3
原创 InnoDB引擎底层存储和缓存原理
到目前为止,MySQL对于我们来说还是一个黑盒,我们只负责使用客户端发送请求并等待服务器返回结果,表中的数据到底存到了哪里?以什么格式存放的?MySQL是以什么方式来访问的这些数据?这些问题我们统统不知道。要搞明白查询优化背后的原理,就必须深入MySQL的底层去一探究竟,而且事务、锁等的原理也要求我们必须深入底层。InnoDB记录存储结构和索引页结构InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中
2021-12-30 14:18:01
3347
原创 Mysql内核语句优化规则详解
在前面的课程中我们看到当我们把SQL语句交给MySQL执行后,MySQL在执行的过程中会有很多的优化措施,比如索引条件下推,回表中的MRR、索引合并等等。但是在执行之前,MySQL会依据一些规则,竭尽全力的把我们的SQL语句进行转换,以期可以达到成某种可以更高效执行的形式,这个过程也可以被称作查询重写或者查询优化,很多时候这些优化可以由我们自行完成以减少MySQL的优化时间。条件化简我们编写的查询语句的搜索条件本质上是一个表达式,这些表达式可能比较繁杂,或者不能高效的执行,MySQL的查询优化器
2021-12-27 17:05:18
626
原创 mysql执行原理之索引合并详解
索引合并是数据库优化 一般来说没法干预我们前边说过MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但存在有特殊情况,在这些特殊情况下也可能在一个查询中使用到多个二级索引,MySQL中这种使用到多个索引来完成一次查询的执行方法称之为:索引合并/index merge,在前面的成本计算中我们说到过这个概念:“我们需要分别分析单独使用这些索引执行查询的成本,最后还要分析是否可能使用到索引合并”。其实optimizer trace输出的文本中就有这个片段:具体的索引合并算法有下边三种。
2021-12-27 10:47:01
1063
原创 从架构师角度全局理解Mysql性能优化
MySQL性能优化其实是个很大的课题,在优化上存在着一个调优金字塔的说法:很明显从图上可以看出,越往上走,难度越来越高,收益却是越来越小的。比如硬件和OS调优,需要对硬件和OS有着非常深刻的了解,仅仅就磁盘一项来说,一般非DBA能想到的调整就是SSD盘比用机械硬盘更好,但其实它至少包括了,使用什么样的磁盘阵列(RAID)级别、是否可以分散磁盘IO、是否使用裸设备存放数据,使用哪种文件系统(Linux下常见的有ext2、3、4和xfs,zfs等,目前比较推荐的是XFS),操作系统的磁盘调度算法(目前比
2021-12-24 17:22:55
1232
1
原创 mysql内核查询成本计算
对于MySQL5.6之前的版本来说,只能通过EXPLAIN语句查看到最后优化器决定使用的执行计划,却无法知道它为什么做这个决策。我们可能有这样的疑问:“我就觉得使用其他的执行方案比EXPLAIN输出的这种方案强,凭什么优化器做的决定和我想的不一样呢?为什么MySQL一定要全文扫描,不用索引呢?”在MySQL 5.6以及之后的版本中,MySQL提出了一个optimizer trace的功能,这个功能可以让我们方便的查看优化器生成执行计划的整个过程。比如对于下面这个SQL语句:SELECT * FR
2021-12-23 10:18:52
1069
原创 数据库表结构及索引设计
数据库表设计良好的表结构设计是高性能的基石,应该根据系统将要执行的业务查询来设计,这往往需要权衡各种因素。糟糕的表结构设计,会浪费大量的开发时间,严重延误项目开发周期,让人痛苦万分,而且直接影响到数据库的性能,并需要花费大量不必要的优化时间,效果往往还不怎么样。在数据库表设计上有个很重要的设计准则,称为范式设计。范式设计什么是范式?范式来自英文Normal Form,简称NF。MySQL是关系型数据库,但是要想设计—个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,分成
2021-12-20 21:44:03
22792
原创 常用并发设计模式
设计并发场景业务时 考虑先不加锁 考虑下面的几种并发设计模式:思考:在一个线程 T1 中如何正确安全的终止线程 T2?错误思路1:使用线程对象的 stop() 方法停止线程stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁, 其它线程将永远无法获取锁 。错误思路2:使用 System.exit(int) 方法停止线程目的仅是停止一个线程,但这种做法会让整个程序都停止正确思路:利用Java线程的中断机制Two-phase Te
2021-12-10 16:00:50
1010
原创 Disruptor思想学习
Disruptor简介Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以
2021-12-09 16:35:42
1001
原创 leader-follwer模式和DelayQueue分析
在Leader-follower线程模型中每个线程有三种模式,leader,follower, processing。 在Leader-follower线程模型一开始会创建一个线程池,并且会选取一个线程作为leader线程,leader线程负责监听网络请求,其它线程为follower处于waiting状态,当leader线程接受到一个请求后,会释放自己作为leader的权利,然后从follower线程中选择一个线程进行激活,然后激活的线程被选择为新的leader线程作为服务监听,然后老的leader则负责
2021-12-07 16:38:32
1510
转载 PriorityBlockingQueue原理分析
PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止,每次出队都返回优先级别最高的或者最低的元素。默认情况下元素采用自然顺序升序排序,当然我们也可以通过构造函数来指定Comparator来对元素进行排序。需要注意的是PriorityBlockingQueue不能保证同优先级元素的顺序。优先级队列PriorityQueue: 队列中每个元素都有一个优先级,出队的时候,优先级最高的先出。.
2021-12-03 10:04:03
847
转载 Java虚假唤醒及如何避免虚假唤醒
先给出一段虚假唤醒的代码如下:public class SynchronizeDemo2 { public static void main(String[] args) { Data2 data = new Data2(); new Thread(() -> { for (int i = 0; i < 5; i++) { try { data.i
2021-11-29 14:24:59
108
原创 深入理解AQS之ReentrantReadWriteLock详解
读写锁介绍现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁(读多写少)。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源(读读可以并发);但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写操作了(读写,写读,写写互斥)。在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它内部,维护了一对相关的锁,一个用
2021-11-26 15:53:08
392
原创 分布式事务介绍
分布式事务 大家先考虑的时候 先考虑是不是 可以避免 能避免就避免 不能避免再使用分布式事务典型场景 当下互联网发展如火如荼,绝大部分公司都进行了数据库拆分和服务化(SOA)。在这种情况下,完成某一个业务功能可能需要横跨多个服务,操作多个数据库。这就涉及到到了分布式事务,用需要操作的资源位于多个资源服务器上,而应用需要保证对于多个资源服务器的数据的操作,要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同资源服务器的数据一致性。典型的分布式事务场景:...
2021-08-23 14:18:50
110
原创 es入门 和 dsl语法部分讲解
ElasticSearch与Lucene的关系Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框架)但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用中,并且Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。Lucene缺点:1)只能在Java项目中使用,并且要以jar包的方式直接集成项目中.2)使用非常复杂-创建索引和搜索索引代码繁杂3)不支持集群环境-索引数据不同步(...
2021-08-09 21:43:15
4388
原创 tomcat 类加载机制 及热部署和热加载
Tomcat的类加载器可以分为两部分,第一个是Tomcat自身所使用的类加载器,会加载jre的lib包及tomcat的lib包的类,遵循类加载的双亲委派机制;第二个是每个Web应用程序用的,每个web应用程序都有自己专用的WebappClassLoader,优先加载/web-inf/lib下的jar中的class文件,这样就隔离了每个web应用程序的影响,但是webappClassLoader没有遵循类加载的双亲委派机制,处理的方法就是在使用webappClassLoader的load加载类会进行过滤,如果
2021-06-04 18:06:59
777
转载 NIO 在Tomcat中的应用
对NIO的理解个人单方面认为,NIO与BIO的最大区别在于主动和被动,使用BIO的方式需要等待被调用方返回数据,很明显此时调用者是被动的。举个例子阻塞IO 假设你是一个胆小又害羞的男孩子,你约了隔壁测试的妹子,但你并不敢主动约会,所以你把自己的手机号码给她,并暗示她想要约会的时候打电话给你。很明显此时你陷入了被动,约不约会的结果需要妹子主动告知你,如果她忘了,那么你要陷入长时间的等待中以及无尽的猜测和自我怀疑中(太惨了)。[如果你是一个胆小害羞又好色的男孩子,那就惨了]非阻塞IO 我们知道,
2021-06-03 15:54:37
1485
转载 Http中Content-Length与Transfer-Encoding区别
1. http/1.1协议中与chunked编码的相关字段1)Entity Body:entity-body只有在message-body出现时才会出现。通过对message-body的解码获得entity-body。transfer-encoding用于确保安全和信息的恰当传输。Entity-length:在应用任何transfer-encoding之前的message-body的长度。即没有编码之前message-body的长度。2)Content-length:用于描述HTTP消息实体的传输
2021-05-21 14:00:59
652
转载 JAVA设计模式之门面模式(外观模式)
医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。 首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验。化验后再回到门诊室。上图描述的是病人在医院里的体验,图中的方
2021-05-19 10:07:55
108
原创 tomcat 请求处理过程 及 详解
war包里面 存的 是class文件 jar包也一样 那么 为啥 tomcat还需要打成war包呢因为jar包有含义的 可能是别的项目的依赖 war包的话 说明是web项目 源码写死的 读war包如上图所示 源码判断直接 以.war结尾的Tomcat的部署方式:在部署的时候Tomcat是并行部署项目可以参照:https://www.cnblogs.com/honger/p/10362774.html描述符部署deployDescriptors(configBase,co...
2021-05-18 21:33:09
1228
1
原创 redis 6新特性
多线程:1. redis 6.0 提供了多线程的支持,redis 6 以前的版本,严格来说也是多线程,只不过执行用户命令的请求时单线程模型,还有一些线程用来执行后台任务, 比如 unlink 删除 大key,rdb持久化等。redis 6.0 提供了多线程的读写IO, 但是最终执行用户命令的线程依然是单线程的,这样,就没有多线程数据的竞争关系,依然很高效。redis 6.0 以前线程执行模式,如下操作在一个线程中执行完成redis 6.0 线程执行模式:可以通过如下参数配置多线程模型
2021-05-17 18:20:59
144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人