自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2023年的破船为何在2024年还未启航

智慧不是知道,是行动。

2024-03-30 17:24:55 351

原创 Ubuntu挂载磁盘

fdisk -ldf -h。

2024-05-27 22:36:42 95

原创 2024-安装VMware® Workstation 17 Pro

网上搜索的许可证 JU090-6039P-08409-8J0QH-2YR7F。需要正确的城市和邮政编码。

2024-04-22 10:46:55 230

原创 2024-Java-Maven学习笔记

核心掌握目标安装maven安装、环境变量、maven配置文件修改工程创建gav属性理解、IDEA创建工程、项目结构依赖管理依赖添加、依赖传递、版本提取、导入依赖错误解决构建管理构建过程、构建场景、构建周期继承和聚合理解继承和聚合的作用和配置所有依赖在父maven项目中管理,子maven无需使用版本;可选依赖放入;所有依赖的版本号通过管理;管理所有子模块;

2024-04-11 21:38:28 988

原创 2024-服务部署-Sealos

【代码】2024-服务部署-Sealos。

2024-04-09 00:02:58 222

原创 2024使用VMware® Workstation 17 Pro部署Ubuntu22.04

官网下载镜像 https://ubuntu.com/download/server,配置好vmware的NAT网络。

2024-04-07 23:03:48 375

原创 又是新的一年

不要传播,没有课件。

2024-02-20 10:41:23 118

原创 如何使用工具连接宝塔面板上安装的mysql数据库?

添加数据库。

2024-01-05 21:35:09 419

原创 55.RabbitMQ核心编程模型以及消息应用场景详解

【代码】55.RabbitMQ核心编程模型以及消息应用场景详解。

2023-10-31 21:12:53 641

原创 54.RabbitMQ快速实战以及核心概念详解

RabbitMQ Server的服务器称为BrokerRabbitMQ集群中划分出多个客户端与RabbitMQ进行交互,首先就需要建立一个TPC连接,这个连接就是Connection。一旦客户端与RabbitMQ建立了连接,就会分配一个AMQP信道 Channel。RabbitMQ为了减少性能开销,也会在一个Connection中建立多个Channel。消息发送到RabbitMQ中后,会首先进入一个交换机,然后由交换机负责将数据转发到不同的队列中。交换机多用来与生产者打交道。

2023-10-30 19:22:10 757

原创 53.MongoDB分片集群&高级集群架构详解

对于128MB的默认范围大小,对于给定的集合,两个分片必须具有至少384MB的数据大小差异,才能进行迁移。均衡器会优先考虑chunk是否正处于某个分片区间上(被完全包含),如果是则会将chunk迁移到分片区间所关联的分片,否则按一般情况处理。MongoDB的数据均衡器运行于Primary Config Server(配置服务器的主节点)上,而该节点也同时会控制chunk数据的搬迁流程。分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。

2023-10-29 10:57:56 847

原创 52.MongoDB复制(副本)集实战及其原理分析

比如你部署了2个节点的复制集,1个 Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加⼀个 Arbiter节点,即使有节点宕机,仍能选出Primary。一个影响检测机制的因素是心跳,在复制集组建完成之后,各成员节点会开启定时器,持续向其他成员发起心跳,这里涉及的参数为heartbeatIntervalMillis,即心跳间隔时间,默认值是2s。Primary:主节点,其接收所有的写请求,然后把修改同步到所有备节点。

2023-10-28 12:01:25 689

原创 51.MongoDB聚合操作与索引使用详解

原始数据集 -----------Stage---------》中间结果 ------------Stage--------》中间结果 --------------------》结果集。从效果而言,聚合框架相当于 SQL 查询中的GROUP BY、 LEFT OUTER JOIN 、 AS等。整个聚合运算过程称为管道(Pipeline),由多个阶段(Stage)组成。MongoDB采用B+Tree 做索引,索引创建colletions上。聚合操作允许用户处理多个文档并返回计算结果。

2023-10-27 16:06:56 579

原创 50.MongoDB快速入门实战

系统日志,这非常符合固定集合的特征,而日志系统通常也只需要一个固定的空间来存放日志。在MongoDB内部,副本集的同步日志(oplog)就使用了固定集合。MongoDB是一个文档数据库(以 JSON 为数据模型),由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。得益于内部缓存的作用,对于这种少量文档的查询是非常高效的。原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。保证数据库只会存储“限额”的数据,超过该限额的旧数据都会被丢弃。

2023-10-26 22:40:20 532

原创 49.Redis缓存设计与性能优化

小概率事件//线程1 写数据库stock = 5 ---------------》更新缓存//线程2 写数据库stock = 4 -----》更新缓存//线程1 ------》写数据库stock = 10 -----》删除缓存//线程2 -----------------------------------------------------------------------------------------------》写数据库stock = 9 -----》删除缓存。

2023-10-25 13:21:00 815

原创 48.Redis缓存设计与性能优化

以上我们针对的都是。

2023-10-24 20:32:21 510

原创 47.Redis Cluster集群运维与核心原理剖析

当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。假设name和age计算的hash slot值不一样,但是这条命令在集群下执行,redis只会用大括号里的 user1 做hash slot计算,所以算出来的slot值肯定相同,最后都能落在同一slot。当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。

2023-10-22 20:57:13 121

原创 46.Redis持久化、主从与哨兵架构详解

哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis主节点通知给client端。如果开启混合持久化,AOF重写时,将之前的记录做RDB快照处理 + 新增命令以AOF格式存储,提升重启效率。sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。AOF体积大,恢复慢,数据安全性根据策略决定。

2023-10-21 23:02:02 98

原创 45.Redis核心数据结构实战与高性能原理剖析

Blocking MQ(阻塞队列)= LPUSH + BRPOP。LPUSH msg:{诸葛老师-ID} 10018。LRANGE msg:{诸葛老师-ID} 0 4。LPUSH msg:{诸葛老师-ID} 10086。Queue(队列)= LPUSH + RPOP。1)MacTalk发微博,消息ID为10018。2)相比string操作消耗内存与cpu更小。2)备胎说车发微博,消息ID为10086。1)同类数据归类整合储存,方便数据管理。3)相比string储存更节省空间。

2023-10-20 22:26:04 103

原创 44.Spring事务底层实现源码解析

Spring事务有可能会提交,回滚、挂起、恢复,所以Spring事务提供了一种机制,可以让程序员来监听当前Spring事务所处于的状态。以非事务方式运行,Spring事务管理器不会去建立数据库连接,执行sql时,由Mybatis或JdbcTemplate自己来建立数据库连接来执行sql。执行MethodInvocation.proceed()方法,简单理解就是执行业务方法,其中就会执行sql。默认情况下传播机制为REQUIRED,表示当前如果没有事务则新建一个事务,如果有事务则在当前事务中执行。

2023-10-19 16:18:18 57

原创 43.SpringAOP底层实现源码解析

DefaultAdvisorAutoProxyCreator的父类是AbstractAdvisorAutoProxyCreator。只要Spring容器中存在这个类型的Bean,就相当于开启了AOP,AbstractAdvisorAutoProxyCreator实际上就是一个BeanPostProcessor,所以在创建某个Bean时,就会进入到它对应的生命周期方法中,比如:在某个Bean初始化之后。

2023-10-18 16:09:28 46

原创 42.SpringAOP底层实现源码解析

Advice分为不同的类型,后面详细讨论,在很多AOP框架中,包括Spring,会用Interceptor拦截器来实现Advice,并且在连接点周围维护一个Interceptor链。Join point:表示连接点,表示一个程序在执行过程中的一个点,比如一个方法的执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行。Pointcut:表示切点,用来匹配一个或多个连接点,Advice与切点表达式是关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上。

2023-10-17 16:37:36 42

原创 41.Spring之循环依赖底层源码解析

只有在出现了循环依赖的情况,才会执行lambda表达式,才会进行AOP,也就说只有在出现了循环依赖的情况下才会打破Bean生命周期的设计,如果一个Bean没有出现循环依赖,那么它还是遵守了Bean的生命周期的设计的。一级缓存 singletonObjects 缓存的是已经经历了完整生命周期的bean对象。如果只有一个缓存,导致AOP产生的代理对象与原始对象不一致的问题,需要提前进行AOP。被Spring管理的对象叫做Bean。Bean的生成简易步骤如下。A对象依赖了B对象,B对象依赖了A对象。

2023-10-16 16:38:34 43

原创 40.SpringIoC之依赖注入源码解析

掌握这些注解是如何工作的 @Autowired @Value @Qulifier @Lazy @Resource 以及泛型注入。先找@Primary,然后是判断实现OrderComparator的优先级,最后通过名字确定唯一的Bean。基于 DependencyDescriptor 获取参数类型和名字。判断字段或者参数上有没有@Lazy ,如果有则返回一个代理对象。@value 的spring表达式会扫描环境变量,启动参数,找到多个,把所有找到的bean放入Map中。@Qualifier的使用。

2023-10-15 13:47:01 48

原创 39.Bean的销毁过程

但是我们在定义一个Bean时,如果这个Bean实现了DisposableBean接口,或者实现了 AutoCloseable接口,或者在BeanDefinition中指定了destroyMethodName,那么这个Bean都属 于“DisposableBean”,这些Bean在容器关闭时都要调用相应的销毁方法。在销毁时,Spring会找出实现了DisposableBean接口的Bean。@Autowired注解。

2023-10-14 15:32:12 43

原创 37.SpringIoC之Bean生命周期源码解析

Spring最重要的功能就是帮助程序员创建对象(也就是IOC)

2023-10-12 15:24:18 55

原创 36.Spring整体源码架构前置核心概念解析

其实在很多场景下他俩是可以替换的,但是站在原理层面来说的,区别很明显,@Bean定义的Bean是会经过完整的Bean生命周期的。在Spring源码中,有可能需要把String转成其他类型,所以在Spring源码中提供了一些技术来更方便的做对象的类型转化,关于类型转化的应用场景, 后续看源码的过程中会遇到很多。它的作用和BeanDefinitionReader类似,它可以进行扫描,扫描某个包路径,对扫描到的类进行解析。BeanFactory会负责创建Bean,并且提供获取Bean的API。

2023-10-11 15:20:53 42

原创 35.学源码最快的方式:带你手写一个Spring

UserService.class > 无参构造方法 (推断构造方法)> 普通对象 > 依赖注入(属性赋值) > 初始化前@PostConstruct > 初始化InitializingBean > 初始化后(AOP)> 代理对象 > Bean。代码中 postProcessBeforeInitialization 和 postProcessAfterInitialization 的实现并不合理,感觉也没有必要。关于里面实现的代理对象,看起来像是栈逻辑。简单实现以下spring流程。

2023-10-10 14:06:31 42

原创 34.一节课快速掌握Spring底层原理整体脉络

目标:对Spring的底层有一个整体的大致了解UserService.class > 无参构造方法 (推断构造方法)> 普通对象 > 依赖注入(属性赋值) > 初始化前@PostConstruct > 初始化InitializingBean > 初始化后(AOP)> 代理对 > Bean新版的Spring MVC和Spring Boot的底层主要用的都是spring.xml和AppConfig.class本质上是一样的。

2023-10-09 13:29:48 42

原创 33.CPU缓存架构详解&高性能内存队列Disruptor实战

网络系统之零拷贝网络系统之PageCache有什么用。

2023-10-08 11:35:19 74

原创 32.并发容器(Map、List、Set)实战及其原理

java先提供了同步容器供用户使用,可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList。跳表是一种基于有序链表的数据结构,支持快速插入、删除、查找操作,其时间复杂度为O(log n),比普通链表的O(n)更高效。java的集合容器框架主要有四大类别:List、Set、Queue、Map,都是非线程安全的。java.util.concurrent包中提供了多种并发类容器,解决同步容器的性能问题。

2023-10-07 20:48:58 35

原创 31.常用并发设计模式精讲

跳出来,看全局;钻进去,看本质。

2023-10-06 15:34:00 75 1

原创 30.深入理解并发可见性、有序性、原子性与JMM内存模型

/3.设置instance指向刚刚分配的内存地址上面2和3之间可能会被重排序JSR-133使用happens-before的概念来指定两个操作之间的执行顺序。由于这两个操作可以在一个线程之内,也可以在不同的线程之内。因此,JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证。> JMM遵循一个基本原则:只要不改变程序的执行结果,编译器和处理器怎么优化都行。### 总结。

2023-10-05 21:44:47 29

原创 29.线程池ForkJoinPool工作原理分析

Fork/Join是一个是一个并行计算的框架,主要就是用来支持分治任务模型的,这个计算框架里的 Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。它的核心思想是将一个大任务分成许多小任务,然后并行执行这些小任务,最终将它们的结果合并成一个大的结果。Fork/Join是一种基于分治思想的模型,在并发处理计算型任务时有着显著的优势。任务切分:将大的任务分割成更小粒度的小任务,让更多的线程参与执行;任务窃取:通过任务窃取,充分地利用空闲线程,并减少竞争。

2023-10-04 21:19:50 47 1

原创 28.线程池ThreadPoolExecutor实战及其原理分析

在java,中断一个线程,只是修改了该线程的一个标记,并不是直接kill了这个线程,被中断的线程到底要不要消失,由被中断的线程自己来判断,比如上面代码中,线程遇到了中断异常,它可以选择什么都不做,那线程就会继续进行外层循环,如果选择return,那就退出了循环,后续就会运行结束从而消失。根据前面execute方法的源码,只要线程池的状态不是RUNNING,那么就表示线程池不接受新任务,所以shutdown方法要做的第一件事情就是修改线程池状态。

2023-10-03 15:19:40 42

原创 27.线程池ThreadPoolExecutor实战及其原理分析

CPU密集型任务:CPU核心数+1,这样既能充分利用CPU,也不至于有太多的上下文切换成本IO型任务:建议压测,或者先用公式计算出一个理论值(理论值通常都比较小)对于核心业务(访问频率高),可以把核心线程数设置为我们压测出来的结果,最大线程数可以等于核心线程数,或者大一点点,比如我们压测时可能会发现500个线程最佳,但是600个线程时也还行,此时600就可以为最大线程数。

2023-10-02 22:33:58 61 1

原创 26.阻塞队列BlockingQueue实战及其原理分析

阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。设计注意点: 用while不用if是为了防止虚假唤醒。使用队列实现削峰,平滑过渡到下一秒。基于数组,基于链表的实现。

2023-10-01 22:41:56 50

原创 25.JVM

垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。java源码 xxx.java → java编译器(词法分析,语法分析 → 语法树 →语义分析→注解抽象语法树→字节码生成器)→字节码文件 xxx.class → JVM。Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。架构师每天都在思考什么?

2023-09-30 21:45:45 32

原创 24.深入理解AQS之ReentrantLock源码分析

java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。阻塞等待队列共享/独占公平/非公平可重入允许中断同步等待队列: 主要用于维护获取锁失败时入队的线程。基于双向链表数据结构的队列,是FIFO先进先出线程等待队列。

2023-09-29 17:44:24 32

原创 23.JUC并发工具类在大厂的应用场景详解

Phaser可以被视为CyclicBarrier和CountDownLatch的进化版,它能够自适应地调整并发线程数,可以动态地增加或减少参与线程的数量。具体交换数据是通过exchange方法来实现的,如果一个线程先执行exchange方法,那么它会同步等待另一个线程也执行exchange方法,这个时候两个线程就都达到了同步点,两个线程就可以交换数据。CyclicBarrier(回环栅栏或循环屏障),是 Java 并发库中的一个同步工具,通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。

2023-09-28 16:53:52 49

空空如也

空空如也

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

TA关注的人

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