自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【BIOS实战】

文章目录网络通信编程基本常识网络通信编程基本常识

2024-01-04 23:58:50 369

原创 【zookeeper选举源码分析】

2、抓主线:找一个demo入手,顺藤摸瓜快速静态看一遍框架的主线源码,画出源码主流程图,切勿一开始就陷入源码的细枝末节,否则。笔记,把源码里的闪光点都记录下来,后续借鉴到工作项目中,理解能力强的可以直接看静态源码,也可以边看源码边debug源码执行过。3、画图做笔记:总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解做。1、提升技术功底:学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提升自己的技术功底。

2024-01-01 23:07:25 662

原创 【zookeeper分布式锁】

在高性能、高并发的应用场景下,不建议使用ZooKeeper的分布式锁。由于ZooKeeper的选举机制和强一致性保证,它可以处理更复杂的分布式锁场景,但相对于。(1)基于数据库的分布式锁。下可以实现简单的分布式锁,但由于数据库操作的性能相对较低,并且可能面临锁表的风险,所以一。性,因此在并发量不是太高的应用场景中,还是推荐使用ZooKeeper的分布式锁。使用临时 znode 来表示获取锁的请求,创建 znode成功的用户拿到锁。的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。

2023-12-28 21:58:05 417

原创 【zookeeper经典应用实战】

setData(path, data, version):如果给定 path 上的 znode 的版本和给定的 version 匹配,设置 znode 数据。getChildren(path, watch):返回给定 path 上的 znode 的孩子 znode 名字,并在 znode 设置一个 watch。delete(path, version):如果给定 path 上的 znode 的版本和给定的 version 匹配, 删除 znode。createMode指定 znode 的类型。

2023-12-26 23:55:06 1428

原创 【zookeeper特点和集群架构】

ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。官方:https://zookeeper.apache.org/ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制)。提供基。

2023-12-24 00:08:45 1769

原创 【Kafka集群架构设计原理】

follower partition每次往leader partition同步消息时,都会同步自己的LEO给leader partition。在Kafka中,一个Topic下的所有消息,是分开存储在不同的Partition中的。在一组Partiton中,Leader Partition通常是比较繁忙的节点,因为他要负责与客户端的数据交互,以及向。个HW值以前的消息,都是在所有follower partition之间完成了同步的,是安全的。但是,在选举过程中,原来Partition上的数据是如何处理的呢?

2023-12-20 23:54:59 944

原创 【从客户端理解Kafka的使用方式】

这一部分主要是从客户端使用的角度来理解Kakfa的重要机制。重点依然是要建立自己脑海中的Kafka消费模型。Kafka的HighLevel API使用是非常简单的,所以梳理模型时也要尽量简单化,主线清晰,细节慢慢扩展。Kafka提供了两套客户端API,HighLevel API和LowLevel API。HighLevel API封装了kafka的运行细节,使用起来比较简单,是企业开发过程中最常用的客户端API。而LowLevel API则需要客户端自己管。

2023-12-16 22:53:17 1056

原创 【Kafka基本原理】

MQ:MessageQueue,消息队列。队列,是一种FIFO 先进先出的数据结构。消息则是跨进程传递的数据。一个典型的MQ系统,会将消息消息由生产者发送到MQ进行排队,然后根据一定的顺序交由消息的消费者进行处理。QQ和微信就是典型的MQ。只不过他对接的使用对象是人,而Kafka需要对接的使用对象是应用程序。MQ的作用主要有以下三个方面:异步例子:快递员发快递,直接到客户家效率会很低。引入菜鸟驿站后,快递员只需要把快递放到菜鸟驿站,就可以继续发其他快递去了。

2023-12-13 23:56:35 364

原创 【RabbitMQ高可用集群架构】

其实对于RabbitMQ,一个节点的服务也是作为一个集群来处理的,在web控制台的admin-> cluster 中可。通常在生产环境中,为了减少RabbitMQ集群之间的数据传输,在配置镜像策略时,会针对固定的虚拟主机。之前通过单机环境搭建起来的RabbitMQ服务有一个致命的问题,那就是服务不稳定的问题。这种集群模式下,集群的各个节点之间只会有相同。的节点, RabbitMQ会临时在节点之间进行数据传输,将消息从存有数据的节点传输到消费的节点。中,系统的资源都是会做预留的,所以正常的使用是没有问题的。

2023-12-10 23:45:34 1102 1

原创 【RabbitMQ高级功能详解以及常用插件实战】

1、一些临时使用的队列:比如transient临时队列,exclusive独占队列,或者经常会修改和删除的队列。仲裁队列,是RabbitMQ从3.8.0版本,引入的一个新的队列类型,整个3.8.X版本,也都是在围绕仲裁队列。仲裁队列相比Classic经典队列,在分布式环境下对消息的可靠性保障更高。Connection连接来进行使用,包括队列创建、删除、收发消息等,并且独占队列会在声明该队列的。4、队列消息积压严重 : 如果队列中的消息很大,或者积压的消息很多,就不要使用Quorum队列。

2023-12-07 22:34:33 1418

原创 【RabbitMQ基础编程模型】

接下来我们只是通过Java语言来理解下要如何使用RabbitMQ。其他语言客户端可以参考示例与官方文件,RabbitMQ的使用生态已经相当庞大,支持非常多的业务场景,同时也提供了非常多的客户端语言支持。使用RabbitMQ提供的原生客户端API进行交互。这是使用RabbitMQ的基础。

2023-12-05 23:48:02 606

原创 【MQ核心概念理解】

ChatGPT中对于消息队列的介绍是这样的:MQ:MessageQueue,消息队列。这东西分两个部分来理解:队列,是一种FIFO 先进先出的数据结构。消息:在不同应用程序之间传递的数据。将消息以队列的形式存储起来,并且在不同的应用程序之间进行传递,这就成了MessageQueue。而MQ的作用,从刚才ChatGPT的介绍中就能够抽象出三个关键字:异步、解耦、削峰。但是这什么意思呢?跟开发有什么关系?我们从一个简单的SpringBoot应用开始说起。

2023-12-02 23:51:21 457

原创 【redis缓存设计】

发过来,缓存层支撑不住,或者由于缓存设计不好,类似大量请求访问bigkey,导致缓存能支撑的并发急剧下。缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储。对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不。降), 于是大量请求都会打到存储层, 存储层的调用量会暴增, 造成存储层也会级联宕机的情况。缓存雪崩指的是缓存层支撑不住或宕掉后, 流量会像奔逃的野牛一样, 打向后端存储层。当它说不存在时,那就肯定不存在。

2023-11-30 23:46:24 412

原创 【redis缓存高可用集群】

文章目录Redis集群方案比较Redis集群方案比较

2023-11-28 23:52:28 437

原创 【redis主从架构】

slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master。sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis。毕以后,master会把这份rdb文件数据集发送给slave,slave会把接收到的数据进行持久化生成rdb,然后。3、替代redis的事务功能:redis自带的事务功能很鸡肋,而redis的lua脚本几乎实现了常规的事务功能,管道不是原子的,不过。

2023-11-25 23:38:11 1039

原创 【redis持久化】

从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文。这样的话, 当 Redis 重新启动时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。简单来说,bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。注意,如果执行带过期时间的set命令,aof文件里记录的是并不是执行的原始命令,而是记录key过期的。

2023-11-23 23:49:26 361

原创 【redis数据结构和高性能原理】

但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外。Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如。因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性。

2023-11-22 23:52:19 37

原创 【spring事物】

一个Bean在执行Bean的创建生命周期时,会经过InfrastructureAdvisorAutoProxyCreator的初始。@Transactional注解,如果存在则表示该Bean需要进行动态代理产生一个代理对象作为Bean对象。配,匹配逻辑为判断该Bean的类上是否存在@Transactional注解,或者类中的某个方法上是否存在。在开发过程中,经常会出现一个方法调用另外一个方法,那么这里就涉及到了多种场景,比如a()调用。该代理对象在执行某个方法时,会再次判断当前执行的方法是否和。

2023-11-20 23:46:47 34

原创 【spring的AOP】

口,就会用cglib技术,上面的代码,就是由于UserService实现了UserInterface接口,所以最后产生。由于这个限制,所以产生的代理对象的类型是UserInterface,而不是UserService,这是需要注意。上面是通过cglib来实现的代理对象的创建,是基于父子类的,被代理类(UserService)是父类,代。理类是子类,代理对象就是代理类的实例对象,代理类是由cglib创建的,对于程序员来说不用关心。jdk本身也提供了一种创建代理对象的动态代理机制,但是它只能代理接口,也就是。

2023-11-16 23:14:32 42

原创 【spring配置类】

解析AppConfig类,生成对应的ConfigurationClass再扫描,扫描到的类都会生成对应的BeanDefinition,并且同时这些类也是ConfigurationClass再解析ConfigurationClass的其他信息,比如@ImportResource注解的处理,@Import注解的处理,@Bean注解的处理。

2023-11-15 23:46:02 77

原创 【spring启动过程】

文章目录

2023-11-13 23:56:40 24

原创 【构造方法】

Spring中的一个bean,需要实例化得到一个对象,而实例化就需要用到构造方法。再来看第二点,如果开发者没有指定想要使用的构造方法,则看开发者有没有让Spring自动去选择构造方法,对于这一点,只能用在ClassPathXmlApplicationContext,因为通过AnnotationConfigApplicationContext没有办法去指定某个bean可以自动去选择构造方法,而通过。

2023-11-12 23:54:02 29

原创 【spring循环依赖】

earlySingletonObjects比singletonObjects多了一个early,表示缓存的是早期的bean对象。三级缓存是通用的叫法。singletonFactories中缓存的是ObjectFactory,表示对象工厂,表示用来创建早期bean对象的。表示Bean的生命周期还没走完就把这个Bean放入了earlySingletonObjects。singletonObjects中缓存的是已经经历了完整生命周期的bean对象。三级缓存为**:singletonFactories**

2023-11-10 23:57:36 30

原创 【Spring依赖注入】

该方法表示,传入一个依赖描述(DependencyDescriptor),该方法会根据该依赖描述从BeanFactory中找出对应的唯一的一个Bean对象。

2023-11-08 23:54:36 76

原创 【Spring之依赖注入源码解析】

方法参数个数为1个,并且 (方法名字以"set"开头并且方法返回类型为void)

2023-11-07 23:54:31 28

原创 【spring的Bean源码解析】

通过扫描得到所有BeanDefinition之后,就可以根据BeanDefinition创建Bean对象了,但是在。因为child的父BeanDefinition是parent,所以会继承parent上所定义的scope属性。而在根据child来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整的child的。Spring中支持父子BeanDefinition,和Java父子类类似,但是完全不是一回事。但是这么定义的情况下,child就是原型Bean了。

2023-11-03 23:56:14 56

原创 【spring底层架构核心原理】

BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。Bean,最终都会被Spring解析为对应的BeanDefinition对象,并放入Spring容器中。进行扫描,扫描某个包路径,对扫描到的类进行解析,比如,扫描到的类上如果存在@Component。和申明式事务、编程式事务类似,通过,@Bean,@Component等申明式方式所定义的。注解,那么就会把这个类解析为一个BeanDefinition,class,表示Bean类型。

2023-10-31 23:54:08 35

原创 【spring核心底层原理】

文章目录

2023-10-29 23:58:06 38

原创 【并发特性】

一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。在 Java中,对基本数据类型的变量的读取和赋值操作是原子性操作(64位处理器)。可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。并发编程Bug的源头:原子性、可见性和有序性问题。障措施的自增操作并不是原子性的,比如i++操作。通过 synchronized 关键字保证可见性。通过 volatile 关键字保证可见性。通过 Lock锁保证可见性。通过 内存屏障保证可见性。

2023-10-27 23:44:57 27

原创 【线程池ForkJoinPool原理】

归并排序(Merge Sort)是一种基于分治思想的排序算法。归并排序的基本思想是将一个大数组分成两个相等大小的子数组,对每个子数组分别进行排序,然后将两个子数组合并成一个有序的大数组。因为常常使用递归实现(由先拆分后合并的性质决定的),所以我们称其为归并排序。归并排序的步骤包括以下几个方面:将数组分成两个子数组对每个子数组进行排序合并两个有序的子数组归并排序的时间复杂度为O(nlogn),空间复杂度为O(n),其中n为数组的长度。

2023-10-25 23:54:47 147

原创 【线程池】

TIDYING:所有任务都终止了,线程池中也没有线程了,这样线程池的状态就会转为TIDYING,一旦达到此状。在源码中,当执行任务时出现异常时,最终会执行processWorkerExit(),执行完这个方法后,当前线。因为stop()方法太粗暴了,一旦调用了stop(),就会直接停掉线程,但是调用的时候根本不知道线程刚。线程池中的线程在运行过程中,执行完创建线程时绑定的第一个任务后,就会不断的从队列中获取任。务并执行,那么如果队列中没有任务了,线程为了不自然消亡,就会阻塞在获取队列任务时,等着队。

2023-10-21 22:09:39 31

原创 【读写锁】

读写锁ReadWriteLock,顾名思义一把锁分为读与写两部分,读锁允许多个线程同时获得,因为读操作本身是线程安全的。而写锁是互斥锁,不允许多个线程同时获得写锁。并且读与写操作也是互斥的。读写锁适合多读少写的业务场景。针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它内部,维护了一对相关的锁,一个用于只读操作,称为读锁;一个用于写入操作,称为写锁,描述如下:线程进入读锁的前提条件:没有其他线程的写锁。

2023-10-19 23:47:22 40

原创 【理解AQS】

java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法。

2023-10-17 23:46:18 33

原创 【java并发工具类】

jdk提供了比synchronized更加高级的各种同步工具,包括ReentrantLock、Semaphore、CountDownLatch、非公平锁:线程在获取锁时,不按照等待的先后顺序获取锁,而是随机获取锁。ReentrantLock默认是非公平锁。它的功能类似于synchronized是一种互斥锁,可以保证线程安全。相对于 synchronized,ReentrantLock是一种可重入的独占锁,它允许同一个线程多次获取同一个锁而不会被阻塞。公平锁:线程在获取锁时,按照等待的先后顺序获取锁。

2023-10-14 23:45:22 77 1

原创 【CAS&Atomic 原子操作详解】

如,有两个共享变量 i=2,j=a,合并一下 ij=2a,然后用 CAS 来操作 ij。全部执行完,要么完全不执行 B,执行 B 的线程看 A 的操作也是一样的,那么 A。则更新,但是如果一个值原来是 A,变成了 B,又变成了 A,那么使用 CAS 进行。都包含多个步骤,如果从执行 A 的线程来看,当另一个线程执行 B 时,要么将 B。作,但是对多个共享变量操作时,循环 CAS 就无法保证操作的原子性,这个时候。个新值 B,操作的时候如果这个地址上存放的值等于这个期望的值 A,则将地址。

2023-10-12 22:17:29 139

原创 【并发安全】

死锁的发生必须具备以下四个必要条件。1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

2023-10-11 23:42:51 28

原创 【ThreadLocal学习总结】

JVM利用设置ThreadLocalMap的Key为弱引用,来避免内存泄露。JVM利用调用remove、get、set方法的时候,回收弱引用。当ThreadLocal存储很多Key为null的Entry的时候,而不再去调用remove、get、set方法,那么将导致内存泄漏。使用线程池+ ThreadLocal时要小心,因为这种情况下,线程是一直在不断的重复运行的,从而也就造成了value可能造成累积的情况。

2023-10-09 23:41:26 71

原创 【深入理解并发、线程与等待通知机制】

(Lightweight Process,LWP),早期 Linux 的线程实现几乎就是复用的进程,后来。Java Web 开发里。显然,程序是死的、静态的,进程是活的、动态。一个机器中肯定会运行很多的程序,CPU 又是有限的,怎么让有限的 CPU。(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如。线程必须依赖于进程而存在,线程是进程中的一个实体,是 CPU 调度和分。派的基本单位,它是比进程更小的、能独立运行的基本单位。但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

2023-10-05 22:58:48 49

原创 【JVM常量池】

还有一项信息就是常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic。Class常量池可以理解为是Class文件中的资源仓库。Class文件中除了包含类的版本、字段、方法、接口等描述信息外,字面量只可以右值出现,所谓右值是指等号右边的值,如:int a=1 这里的a为左值,1为右值。在这个例子中1就是字面。符号引用是编译原理中的概念,是相对于直接引用来说的。字面量就是指由字母、数字等构成的字符串或者数值常量。

2023-10-03 22:42:57 28

原创 【JVM调优工具】

此命令可以用来查看内存信息,实例个数以及占用内存大小Jmap -head 14660也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)用jstack加进程id查找死锁** 还可以用jvisualvm自动检测死锁**启动普通的jar程序JMX端口配置java ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.50.60 ‐Dcom.sun.management.jmxremote.ss

2023-10-01 21:53:07 40

空空如也

空空如也

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

TA关注的人

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