自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

张维鹏的博客

芝兰生于幽谷,不以无人而不芳!

  • 博客(277)
  • 资源 (2)
  • 收藏
  • 关注

原创 常见分布式理论(CAP、BASE)和一致性协议(Gosssip协议、Raft一致性算法)

分布式系统只能同时满足CAP中的两种,在设计分布式架构时必须做出取舍,而分区容忍性是基本要求,必须要满足,所以设计分布式系统,就是在一致性和可用性之间取一个平衡。BASE是对CAP中一致性和可用性权衡的结果,核心思想是即使无法做到强一致性,但每个业务根据自身的特点,采用适当的方式来使系统达到最终一致性。

2022-01-10 08:15:00 16311 5

原创 七种常见分布式事务详解(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)

在分布式系统中一次操作需要由多个服务协同完成,这种由不同的服务之间通过网络协同完成的事务称为分布式事务。本文详解介绍七种常见分布式事务的原理以及优缺点和适用场景(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)

2022-01-10 08:15:00 68289 13

原创 分布式事务Seata原理

Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。Seata AT模式是基于XA事务演进而来,需要数据库支持。AT 模式的特点就是对业务无入侵式,用户只需要关注自己的业务SQL,Seata 框架会在第一阶段拦截并解析用户的 SQL,并保存其变更前后的数据镜像,形成undo log,并自动生成事务第二阶段的提交和回滚操作。

2022-01-10 08:15:00 21945

原创 分布式事务seate-server的docker镜像的制作与部署

Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务。在 Seata 中主要有以下三种角色,其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的 Server 端(下文简称 seata-server)独立部署。而 seata-server 的部署模式支持多种:直接部署,使用 Docker、Docker-Compose、Kubernetes、Helm 等,本文主要介绍如何使用 docker 部署 seata-server

2022-01-10 08:15:00 2420

原创 毕业两年半,星光不问赶路人,时光不负有心人

星光不问赶路人,时光不负有心人。一万个小时定律,“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力,1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。” .........

2021-12-03 08:00:00 4842 11

原创 如何设计一个短URL地址系统

一、短URL系统的原理:短URL系统的核心是将长的 URL 转化成短的 URL;在访问系统时,先使用短地址A访问短URL系统,由短URL系统映射到对应的长地址B,然后客户端再重定向(301或者302)到B网址,如下图所示:二、短 URL 的好处:1、链接变短,对于有长度限制的平台发文,可编辑的文字就变多了2、短链接生成的二维码更易于识别,而长链接的二维码密集难识别3、短链接更加简洁好看且安全,不暴露访问参数。4、能规避关键词、域名屏蔽等手段5、链接太长在...

2021-11-01 08:00:00 3528 2

原创 JUC多线程:系统调用、进程、线程的上下文切换

1、上下文切换就是一个线程释放处理器的使用权,另外一个线程获取处理器的使用权的过程;在切入切出时,系统会保存和读取当前线程的上下文信息,用户恢复线程的执行进度;自发和非自发的调用操作,都会导致上下文切换,会导致系统资源开销。2、在 JDK 的 java.lang.Thread.State 源码中定义了6个状态,在某一时刻,一个线程只能处于一种状态:New、Runnable、Blocked、Waiting、Timed Waiting、Terminated

2021-10-24 08:00:00 8178 1

原创 服务容错设计:流量控制、服务熔断、服务降级

单体应用的故障影响面很大,而分布式系统中由于故障的影响面可以被隔离,所以影响面较小,但是因为服务多,出故障的频率也很多。不过我们需要明白:出现故障不可怕,故障影响面过大才可怕;出现故障不可怕,故障恢复时间过长才可怕。所谓 “防火胜于救火”,所以我们更要考虑如何进行防火,这就要求我们在设计或者运维时都要为可能发生的故障考虑,即所谓 “Design for Failure”,面向失败设计,在设计时要考虑如何减轻故障。而容错设计就是面向失败设计一个非常重要的环节,常见的容错设计有:流量控制、服务熔断、服务降级

2021-10-18 08:00:00 10488 5

原创 一致性哈希算法原理详解

(1)一致性哈希算法将整个哈希值空间按照顺时针方向组织成一个虚拟的圆环,称为 Hash 环;(2)接着将各个服务器使用 Hash 函数进行哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置;(3)最后使用算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针寻找,第一台遇到的服务器就是其应该定位到的服务器

2021-10-17 18:46:56 49965 32

原创 Tomcat 的类加载机制

Tomcat 实际上只有WebAppClassLoader 加载器中打破了双亲委派,其他类加载器还是遵循双亲委派的。 这样做最主要原因是保证同个 Web 容器中的不同 Web 应用程序所使用的类库相互独立,避免相互影响

2021-10-16 19:43:33 7731 4

原创 什么是僵尸进程与孤儿进程

当一个进程调用 exit 命令结束自己的生命时,其实它并没有真正的被销毁,内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等,但是留下一个称为僵尸进程的数据结构,这个结构保留了一定的信息(包括进程号 the process ID,退出状态,运行时间),这些信息直到父进程通过 wait()/waitpid() 来取时才释放

2021-10-12 08:00:00 27326 1

原创 JUC多线程:Atomic原子类与CAS原理

tomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全。而 CAS 算法的具体实现方式在于 Unsafe 类中,Unsafe 类的所有方法都是 native 修饰的,也就是说所有方法都是直接调用操作系统底层资源进行执行相应任务。Atomic 使用乐观策略,每次操作时都假设没有冲突发生,并采用 volatile 配合 CAS 去修改内存中的变量,如果失败则重试,直到成功为止。

2021-10-11 09:45:00 9077

原创 JUC多线程:阻塞队列ArrayBlockingQueue与LinkedBlockingQueue

阻塞队列最大的特性在于支持阻塞添加和阻塞删除方法:(1)阻塞添加:当阻塞队列已满时,队列会阻塞加入元素的线程,直到队列元素不满时才重新唤醒线程执行加入元素操作。(2)阻塞删除:但阻塞队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删除操作

2021-10-11 09:45:00 9549

原创 JUC多线程:ThreadLocal 原理总结

ThreadLocal 提供了线程内部的局部变量,当在多线程环境中使用 ThreadLocal 维护变量时,会为每个线程生成该变量的副本,每个线程只操作自己线程中的变量副本,不同线程间的数据相互隔离、互不影响,从而保证了线程的安全。ThreadLocal 内存泄露的根本原因在于 ThreadLocalMap 的生命周期与当前线程 CurrentThread 的生命周期相同,且 ThreadLocal 使用完没有进行手动删除导致的

2021-10-11 09:30:00 10746 1

原创 JUC多线程:CountDownLatch、CyclicBarrier、Semaphore同步器原理总结

1、CountDownLatch,闭锁,主要作用是使一个或一组线程在其他线程执行完毕之前,一直处于等待状态,直到其他线程执行完成后再继续执行。2、CyclicBarrier,循环栅栏,通过 CyclicBarrier 可以实现一组线程之间的相互等待,当所有线程都到达屏障点之后再执行后续的操作。3、Semaphore 信号量,主要用于控制并发访问共享资源的线程数量,依赖 AQS 的变量 state 作为许可证 permit,通过控制许可证的数量,来保证线程之间的配合。

2021-10-11 09:15:00 10958

原创 JUC多线程:AQS抽象队列同步器原理

AQS,Abstract Queued Synchronizer,抽象队列同步器,是 J.U.C 中实现锁及同步组件的基础。工作原理就是如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就将获取不到锁的线程加入到等待队列中。这时,就需要一套线程阻塞等待以及被唤醒时的锁分配机制,而 AQS 是通过 CLH 队列实现锁分配的机制。

2021-10-11 09:00:00 9194

原创 JUC多线程:JMM内存模型与volatile内存语义

JMM 是 Java 虚拟机定义的一种多线程访问 Java 内存各个变量的访问规范,主要围绕如何解决并发过程中的原子性、可见性、有序性这三个问题来解决线程的安全问题。Java 内存模型将内存分为了主内存和工作内存。主内存存放所有的共享变量,所有线程都可以访问。每个线程都有自己的工作内存,存储了该线程使用到的变量的副本,线程对变量的所有操作都必须在自己的工作内存中完成,不能直接操作主存中的变量。操作时,首先将变量从主内存拷贝到自己的工作内存中,然后在自己的工作内存中对变量进行操作,操作完成后再将变量写回主存

2021-10-09 11:47:01 4231 12

原创 如何实现ABC三个线程按顺序执行十次

题目要求:创建三个线程,每个线程分别打印ABC,并按照ABC的顺序执行十次题目可以使用多种不同的方式解决,下面我们分别使用 Condition 等待唤醒机制、Semaphore 信号量、CountDownLatch 闭锁、Thread.join() 方法四种方式实现题目要求。一、使用一个 ReentrantLock 和 三个 Condition 来实现:import java.util.concurrent.locks.Condition;import java.util.concurr

2021-09-26 01:36:36 10366 2

原创 Java设计模式之行为型:中介者模式

中介者模式通过中介者对象来封装一系列的对象交互,将对象间复杂的关系网状结构变成结构简单的以中介者为核心的星形结构,对象间一对多的关联转变为一对一的关联,简化对象间的关系,便于理解;各个对象之间的关系被解耦,每个对象不再和它关联的对象直接发生相互作用,而是通过中介者对象来与关联的对象进行通讯,使得对象可以相对独立地使用,提高了对象的可复用和系统的可扩展性。在中介者模式中,中介者类处于核心地位,它封装了系统中所有对象类之间的关系,除了简化对象间的关系,还可以对对象间的交互进行进一步的控制。

2021-09-14 17:57:02 15771 11

原创 Java设计模式之结构型:桥接模式

桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。为了达到让抽象部分和实现部分独立变化的目的,桥接模式使用组合关系来代替继承关系,抽象部分拥有实现部分的接口对象,从而能够通过这个接口对象来调用具体实现部分的功能。也就是说,桥接模式中的桥接是一个单方向的关系,只能够抽象部分去使用实现部分的对象,而不能反过来。桥接模式符合“开闭原则”,提高了系统的可拓展性,在两个变化维度中任意扩展一个维度,都不需要修改原来的系统;并且实现细节对客户不透明,可以隐藏实现细节。

2021-09-13 17:31:50 18008 5

原创 Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

工厂模式将目的将创建对象的具体过程屏蔽隔离起来,从而达到更高的灵活性,工厂模式可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式;简单工厂模式的核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离。工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类。抽象工厂模式用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,保证客户端始终只使用同一个产品族

2021-09-13 08:56:43 83302 23

原创 JUC多线程:synchronized锁机制原理 与 Lock锁机制

synchronized 通过当前线程持有对象锁,从而拥有访问权限,而其他没有持有当前对象锁的线程无法拥有访问权限,保证在同一时刻,只有一个线程可以执行某个方法或者某个代码块,从而保证线程安全。synchronized 锁机制在 Java 虚拟机中的同步是基于进入和退出监视器锁对象 monitor 实现的

2021-08-26 08:55:35 15247 11

原创 Elasticsearch搜索引擎之缓存:Request Cache、Query Cache、Fielddata Cache

ElasticSearch 查询需要占用 CPU、内存资源,在复杂业务场景,会出现慢查询,需要花费大量的时间。为了提高系统的性能,除了增加集群硬件配置这种成本高昂的开销外,还可以使用 ES 的缓存,下面我们就介绍几种 ES 中常用的缓存。一、Request cache:1、什么是 Request cache:Request Cache,全称是 Shard Request Cache,即分片级请求缓存。当对一个或多个索引发送搜索请求时,搜索请求首先会发送到ES集...

2021-06-20 22:59:21 19873 10

原创 Elasticsearch搜索引擎:ES的segment段合并原理

一、segment文件的合并流程:当我们往 ElasticSearch 写入数据时,数据是先写入 memory buffer,然后定时(默认每隔1s)将 memory buffer 中的数据写入一个新的 segment 文件中,并进入 Filesystem cache(同时清空 memory buffer),这个过程就叫做 refresh;每个 Segment 事实上是一些倒排索引的集合, 只有经历了 refresh 操作之后,数据才能变成可检索的。ElasticSearch 每次 refresh

2021-06-16 11:48:39 20263 14

原创 ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍

1、Elasticsearch的mapping设置:enabled,index,doc_values,store,_source2、doc_values 详细说明:doc values就是在构建倒排索引时,对开启 doc values 的字段额外构建一个有序的 "document文档 ==> field value“ 的列式存储映射,从而实现对指定字段进行排序和聚合时对内存的依赖,提升该过程的性能。3、doc_values 与 source 的区别?使用 docvalue_fields 检索指定字段

2021-06-15 08:49:05 15882 5

原创 两分钟读懂什么是TPS和QPS

1、TPS:Transactions Per Second,每秒事务数。一个事务是指客户端向服务器发送请求然后服务器做出反应的过程,具体的事务定义,可以是一个接口、多个接口、一个业务流程等等。2、QPS:Queries Per Second,意思是每秒查询率。指一台服务器每秒能够响应的查询次数,用于衡量特定的查询服务器在规定时间内所处理流量多少,主要针对专门用于查询的服务器的性能指标。......

2021-06-15 08:48:02 171466 21

原创 MySQL自增主键auto_increment原理 与 自增主键出现间隙不连续现象的定位

MySQL自增主键auto_increment原理;MySQL的innodb_autoinc_lock_mode参数说明;MySQL的AUTO-INC锁原理;自增主键出现间隙不连续现象的定位;

2021-06-05 17:49:59 16784 10

原创 常见的服务器架构入门:从单体架构、EAI 到 SOA 再到微服务和 ServiceMesh

1、单体架构:将所有业务的表现层,业务逻辑层,数据访问层放在一个工程中最终部署在一台服务器2、垂直架构:按业务场景拆分为互不相干的单体架构项目3、前后端分离:前端关注页面样式与动态数据的解析及渲染,后端专注于具体业务逻辑4、EAI架构:连通与集成相互独立的异构系统,解决信息孤岛的问题。5、SOA架构:将各系统的不同功能单元抽象为服务,服务间通过标准的接口协议连接,从而到达复用6、微服务:SOA思想的一种提炼,强调业务系统彻底的组件化和服务化7、微服务2.0:由服务网格以代理的方式建立稳定的通信

2021-06-01 18:46:12 27052 7

原创 海量数据处理的方法总结

基础知识:bit:位 byte:字节 1 byte= 8 bit int 类型为 4 byte,共32位bit,unsigned int也是 2^32 byte = 4G 1G= 2^30 =10.7亿海量数据处理概述:所谓海量数据处理,就是指数据量太大,无法在较短时间内迅速解决,或者无法一次性装入内存。而解决方案就是:针对时间,可以采用巧妙的算法搭配合适的数据结构,如 Bloom filter/Hashmap/bit-map/堆/数据库/倒排索引/trie树;针对空间...

2021-04-14 00:54:01 22490 1

原创 ElasticSearch搜索引擎常见面试题总结

一、ElasticSearch基础:1、什么是Elasticsearch:Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。全文检索是指对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当查询时,根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。2、Elasticsearch 的基本概念:(1)index 索

2021-04-12 01:29:31 47910 6

原创 计算机网络常见面试题总结

计算机网络模型:TCP/IP 与 OSI 都是为了使网络中的两台计算机能够互相连接并实现通信与回应,但他们最大的不同在于,OSI 是一个理论上的网络通信模型,而 TCP/IP 则是实际上的网络通信标准。一、OSI七层模型:1、物理层:实现计算机节点之间比特流的透明传输,规定传输媒体接口的标准,屏蔽掉具体传输介质和物理设备的差异,使数据链路层不必关心网络的具体传输介质,按照物理层规定的标准传输数据就行2、数据链路层:通过差错控制、流量控制等方法,使有差错的物理线路变为无差错的数据链路。

2021-04-06 00:52:59 52818 12

原创 RabbitMQ消息队列常见面试题总结

RabbitMQ消息队列常见面试题总结;1、什么是消息队列?消息队列的优缺点?2、Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别?3、如何保证消息不被重复消费?4、如何保证消息不丢失,进行可靠性传输?5、如何保证消息的有序性?6、如何处理消息堆积情况?7、如何保证消息队列的高可用?

2021-03-23 23:23:45 68292 19

原创 MySQL数据库:参数优化

数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。本文先从 MySQL 数据库IO相关缓存参数的角度来介绍可以通过哪些参数进行IO优化:一、参数说明:1、query_cache_size / query_cache_type (global):Query cache 主要.

2021-03-08 02:26:20 13598 1

原创 MySQL数据库常见面试题总结

1、数据库中的范式:(1)第一范式(1NF):指表的列不可再分,数据库中表的每一列都是不可分割的基本数据项,同一列中不能有多个值;(2)第二范式(2NF):在 1NF 的基础上,还包含两部分的内容:一是表必须有一个主键;二是表中非主键列必须完全依赖于主键,不能只依赖于主键的一部分;(3)第三范式(3NF):在2NF 的基础上,消除非主键列对主键的传递依赖,非主键列必须直接依赖于主键。(4)BC范式(BCNF):在 3NF 的基础上,消除主属性对于码部分的传递依赖2、SQL语句的执..

2021-03-07 17:41:32 64428 20

原创 MySQL数据库:SQL语句的执行过程

一、客户端的MySQL驱动:我们的系统在和 MySQL 数据库进行通信前,需要先和数据库建立连接,而这个功能就是由MySQL驱动底层帮我们完成的,建立完连接之后,我们只需要发送 SQL 语句就可以执行 CRUD 了。如下图所示:一次 SQL 请求就会建立一个连接,多个请求就会建立多个连接。假设我们的系统是部署在 tomcat 容器中的,tomcat 是可以并发处理多个请求的,这就会导致多个请求会去建立多个连接,然后使用完再都去关闭,这样会有什么问题呢?Java系统在通过 MySQL 驱动 和 .

2021-02-28 23:56:20 21703 11

原创 Spring的Bean加载流程

Spring IOC容器就像是一个生产产品的流水线上的机器,Spring创建出来的Bean就好像是流水线的终点生产出来的一个个精美绝伦的产品。既然是机器,总要先启动,Spring也不例外。因此Bean的加载流程总体上来说可以分为两个阶段:容器启动阶段 Bean创建阶段一、容器启动阶段:容器的启动阶段做了很多的预热工作,为后面Bean的实例化做好了充分的准备,我们首先看一下容器的启动阶段都做了哪些预热工作。1、配置元信息:Spring IOC容器将对象实例的创建与对象实例的使用分离,当业务

2021-02-22 03:25:01 71119 36

原创 Spring容器的启动流程

Spring的启动流程可以归纳为三个步骤:1、初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中;2、将配置类的BeanDefinition注册到容器中;3、调用refresh()方法刷新容器;

2021-02-18 00:08:13 52817 31

原创 Redis集群原理详解

一、redis cluster 介绍:1、单实例的Redis架构:最开始的一主N从加上读写分离,Redis作为缓存单实例貌似也还不错,并且有Sentinel哨兵机制,可以实现主从故障迁移。单实例Redis本质上只有一台Master作为存储,就算机器为128GB的内存,一般建议使用率也不要超过70%-80%,所以最多使用100GB数据就已经很多了,实际中50%就不错了,因为数据量太大也会降低服务的稳定性,而且数据量太大意味着持久化成本高,可能严重阻塞服务,甚至最终切主。所以,单实例还存在以下几

2021-02-16 00:13:04 56263 20

原创 布隆过滤器Bloom Filter简介

背景:如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率:采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL、红黑树)存储,查找时间复杂度为O(logN) 采用哈希表存储,考虑到哈希碰撞,整体时间复杂度也要O[log(n/m)]当需要判断一个元素是否存在于海量数据集合中,不仅查找时间慢,还会占用大量存储空间,接下来看一下布隆过滤器如何解决这个问题1、什么是布隆过滤器:布隆过滤器是一种空间效率很高的随机数据结..

2021-02-08 15:35:45 2396

原创 Redis为什么这么快?Redis的线程模型与Redis多线程

一、Redis有多快?Redis是基于内存运行的高性能 K-V 数据库,官方提供的测试报告是单机可以支持约10w/s的QPS二、Redis为什么这么快:(1)完全基于内存,数据存在内存中,绝大部分请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘IO读取到内存这部分的开销。(2)数据结构简单,对数据操作也简单。Redis中的数据结构是专门进行设计的,每种数据结构都有一种或多种数据结构来支持。Redis正是依赖这些灵活的数据结构,来提升读取和写入的性能。.

2021-02-01 03:06:08 27512 8

Spring+Struts + Hibernate整合jar包

spirng4.3.9+struts2.3.24+hibernate5.0.9整合jar包依赖完整版。

2018-07-13

Spring+SpringMVC+Mybaits整合jar包

spring4.3.9+springmvc4.3.9+mybatis3.4.4的整合jar包依赖完整版。

2018-07-13

空空如也

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

TA关注的人

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