726打卡
文章平均质量分 76
小虾米爱学习
这个作者很懒,什么都没留下…
展开
-
55.RabbitMQ核心编程模型以及消息应用场景详解
【代码】55.RabbitMQ核心编程模型以及消息应用场景详解。原创 2023-10-31 21:12:53 · 656 阅读 · 0 评论 -
54.RabbitMQ快速实战以及核心概念详解
RabbitMQ Server的服务器称为BrokerRabbitMQ集群中划分出多个客户端与RabbitMQ进行交互,首先就需要建立一个TPC连接,这个连接就是Connection。一旦客户端与RabbitMQ建立了连接,就会分配一个AMQP信道 Channel。RabbitMQ为了减少性能开销,也会在一个Connection中建立多个Channel。消息发送到RabbitMQ中后,会首先进入一个交换机,然后由交换机负责将数据转发到不同的队列中。交换机多用来与生产者打交道。原创 2023-10-30 19:22:10 · 768 阅读 · 0 评论 -
53.MongoDB分片集群&高级集群架构详解
对于128MB的默认范围大小,对于给定的集合,两个分片必须具有至少384MB的数据大小差异,才能进行迁移。均衡器会优先考虑chunk是否正处于某个分片区间上(被完全包含),如果是则会将chunk迁移到分片区间所关联的分片,否则按一般情况处理。MongoDB的数据均衡器运行于Primary Config Server(配置服务器的主节点)上,而该节点也同时会控制chunk数据的搬迁流程。分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。原创 2023-10-29 10:57:56 · 957 阅读 · 0 评论 -
52.MongoDB复制(副本)集实战及其原理分析
比如你部署了2个节点的复制集,1个 Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加⼀个 Arbiter节点,即使有节点宕机,仍能选出Primary。一个影响检测机制的因素是心跳,在复制集组建完成之后,各成员节点会开启定时器,持续向其他成员发起心跳,这里涉及的参数为heartbeatIntervalMillis,即心跳间隔时间,默认值是2s。Primary:主节点,其接收所有的写请求,然后把修改同步到所有备节点。原创 2023-10-28 12:01:25 · 733 阅读 · 0 评论 -
51.MongoDB聚合操作与索引使用详解
原始数据集 -----------Stage---------》中间结果 ------------Stage--------》中间结果 --------------------》结果集。从效果而言,聚合框架相当于 SQL 查询中的GROUP BY、 LEFT OUTER JOIN 、 AS等。整个聚合运算过程称为管道(Pipeline),由多个阶段(Stage)组成。MongoDB采用B+Tree 做索引,索引创建colletions上。聚合操作允许用户处理多个文档并返回计算结果。原创 2023-10-27 16:06:56 · 669 阅读 · 0 评论 -
50.MongoDB快速入门实战
系统日志,这非常符合固定集合的特征,而日志系统通常也只需要一个固定的空间来存放日志。在MongoDB内部,副本集的同步日志(oplog)就使用了固定集合。MongoDB是一个文档数据库(以 JSON 为数据模型),由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。得益于内部缓存的作用,对于这种少量文档的查询是非常高效的。原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。保证数据库只会存储“限额”的数据,超过该限额的旧数据都会被丢弃。原创 2023-10-26 22:40:20 · 543 阅读 · 0 评论 -
49.Redis缓存设计与性能优化
小概率事件//线程1 写数据库stock = 5 ---------------》更新缓存//线程2 写数据库stock = 4 -----》更新缓存//线程1 ------》写数据库stock = 10 -----》删除缓存//线程2 -----------------------------------------------------------------------------------------------》写数据库stock = 9 -----》删除缓存。原创 2023-10-25 13:21:00 · 845 阅读 · 0 评论 -
48.Redis缓存设计与性能优化
以上我们针对的都是。原创 2023-10-24 20:32:21 · 520 阅读 · 0 评论 -
47.Redis Cluster集群运维与核心原理剖析
当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。假设name和age计算的hash slot值不一样,但是这条命令在集群下执行,redis只会用大括号里的 user1 做hash slot计算,所以算出来的slot值肯定相同,最后都能落在同一slot。当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。原创 2023-10-22 20:57:13 · 138 阅读 · 0 评论 -
46.Redis持久化、主从与哨兵架构详解
哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis主节点通知给client端。如果开启混合持久化,AOF重写时,将之前的记录做RDB快照处理 + 新增命令以AOF格式存储,提升重启效率。sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。AOF体积大,恢复慢,数据安全性根据策略决定。原创 2023-10-21 23:02:02 · 112 阅读 · 0 评论 -
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 · 115 阅读 · 0 评论 -
44.Spring事务底层实现源码解析
Spring事务有可能会提交,回滚、挂起、恢复,所以Spring事务提供了一种机制,可以让程序员来监听当前Spring事务所处于的状态。以非事务方式运行,Spring事务管理器不会去建立数据库连接,执行sql时,由Mybatis或JdbcTemplate自己来建立数据库连接来执行sql。执行MethodInvocation.proceed()方法,简单理解就是执行业务方法,其中就会执行sql。默认情况下传播机制为REQUIRED,表示当前如果没有事务则新建一个事务,如果有事务则在当前事务中执行。原创 2023-10-19 16:18:18 · 69 阅读 · 0 评论 -
43.SpringAOP底层实现源码解析
DefaultAdvisorAutoProxyCreator的父类是AbstractAdvisorAutoProxyCreator。只要Spring容器中存在这个类型的Bean,就相当于开启了AOP,AbstractAdvisorAutoProxyCreator实际上就是一个BeanPostProcessor,所以在创建某个Bean时,就会进入到它对应的生命周期方法中,比如:在某个Bean初始化之后。原创 2023-10-18 16:09:28 · 60 阅读 · 0 评论 -
42.SpringAOP底层实现源码解析
Advice分为不同的类型,后面详细讨论,在很多AOP框架中,包括Spring,会用Interceptor拦截器来实现Advice,并且在连接点周围维护一个Interceptor链。Join point:表示连接点,表示一个程序在执行过程中的一个点,比如一个方法的执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行。Pointcut:表示切点,用来匹配一个或多个连接点,Advice与切点表达式是关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上。原创 2023-10-17 16:37:36 · 55 阅读 · 0 评论 -
39.Bean的销毁过程
但是我们在定义一个Bean时,如果这个Bean实现了DisposableBean接口,或者实现了 AutoCloseable接口,或者在BeanDefinition中指定了destroyMethodName,那么这个Bean都属 于“DisposableBean”,这些Bean在容器关闭时都要调用相应的销毁方法。在销毁时,Spring会找出实现了DisposableBean接口的Bean。@Autowired注解。原创 2023-10-14 15:32:12 · 54 阅读 · 0 评论 -
37.SpringIoC之Bean生命周期源码解析
Spring最重要的功能就是帮助程序员创建对象(也就是IOC)原创 2023-10-12 15:24:18 · 70 阅读 · 0 评论 -
36.Spring整体源码架构前置核心概念解析
其实在很多场景下他俩是可以替换的,但是站在原理层面来说的,区别很明显,@Bean定义的Bean是会经过完整的Bean生命周期的。在Spring源码中,有可能需要把String转成其他类型,所以在Spring源码中提供了一些技术来更方便的做对象的类型转化,关于类型转化的应用场景, 后续看源码的过程中会遇到很多。它的作用和BeanDefinitionReader类似,它可以进行扫描,扫描某个包路径,对扫描到的类进行解析。BeanFactory会负责创建Bean,并且提供获取Bean的API。原创 2023-10-11 15:20:53 · 52 阅读 · 0 评论 -
35.学源码最快的方式:带你手写一个Spring
UserService.class > 无参构造方法 (推断构造方法)> 普通对象 > 依赖注入(属性赋值) > 初始化前@PostConstruct > 初始化InitializingBean > 初始化后(AOP)> 代理对象 > Bean。代码中 postProcessBeforeInitialization 和 postProcessAfterInitialization 的实现并不合理,感觉也没有必要。关于里面实现的代理对象,看起来像是栈逻辑。简单实现以下spring流程。原创 2023-10-10 14:06:31 · 66 阅读 · 0 评论 -
34.一节课快速掌握Spring底层原理整体脉络
目标:对Spring的底层有一个整体的大致了解UserService.class > 无参构造方法 (推断构造方法)> 普通对象 > 依赖注入(属性赋值) > 初始化前@PostConstruct > 初始化InitializingBean > 初始化后(AOP)> 代理对 > Bean新版的Spring MVC和Spring Boot的底层主要用的都是spring.xml和AppConfig.class本质上是一样的。原创 2023-10-09 13:29:48 · 74 阅读 · 0 评论 -
33.CPU缓存架构详解&高性能内存队列Disruptor实战
网络系统之零拷贝网络系统之PageCache有什么用。原创 2023-10-08 11:35:19 · 91 阅读 · 0 评论 -
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 · 41 阅读 · 0 评论 -
31.常用并发设计模式精讲
跳出来,看全局;钻进去,看本质。原创 2023-10-06 15:34:00 · 114 阅读 · 1 评论 -
28.线程池ThreadPoolExecutor实战及其原理分析
在java,中断一个线程,只是修改了该线程的一个标记,并不是直接kill了这个线程,被中断的线程到底要不要消失,由被中断的线程自己来判断,比如上面代码中,线程遇到了中断异常,它可以选择什么都不做,那线程就会继续进行外层循环,如果选择return,那就退出了循环,后续就会运行结束从而消失。根据前面execute方法的源码,只要线程池的状态不是RUNNING,那么就表示线程池不接受新任务,所以shutdown方法要做的第一件事情就是修改线程池状态。原创 2023-10-03 15:19:40 · 58 阅读 · 0 评论 -
27.线程池ThreadPoolExecutor实战及其原理分析
CPU密集型任务:CPU核心数+1,这样既能充分利用CPU,也不至于有太多的上下文切换成本IO型任务:建议压测,或者先用公式计算出一个理论值(理论值通常都比较小)对于核心业务(访问频率高),可以把核心线程数设置为我们压测出来的结果,最大线程数可以等于核心线程数,或者大一点点,比如我们压测时可能会发现500个线程最佳,但是600个线程时也还行,此时600就可以为最大线程数。原创 2023-10-02 22:33:58 · 81 阅读 · 1 评论 -
26.阻塞队列BlockingQueue实战及其原理分析
阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。设计注意点: 用while不用if是为了防止虚假唤醒。使用队列实现削峰,平滑过渡到下一秒。基于数组,基于链表的实现。原创 2023-10-01 22:41:56 · 77 阅读 · 0 评论 -
25.JVM
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。java源码 xxx.java → java编译器(词法分析,语法分析 → 语法树 →语义分析→注解抽象语法树→字节码生成器)→字节码文件 xxx.class → JVM。Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。架构师每天都在思考什么?原创 2023-09-30 21:45:45 · 41 阅读 · 0 评论 -
23.JUC并发工具类在大厂的应用场景详解
Phaser可以被视为CyclicBarrier和CountDownLatch的进化版,它能够自适应地调整并发线程数,可以动态地增加或减少参与线程的数量。具体交换数据是通过exchange方法来实现的,如果一个线程先执行exchange方法,那么它会同步等待另一个线程也执行exchange方法,这个时候两个线程就都达到了同步点,两个线程就可以交换数据。CyclicBarrier(回环栅栏或循环屏障),是 Java 并发库中的一个同步工具,通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。原创 2023-09-28 16:53:52 · 61 阅读 · 0 评论 -
21.导致JVM内存泄露的ThreadLocal详解
Java里的 HashMap 用的就是链地址法,为了避免 hash 洪水攻击,1.8 版本开始还引 入了红黑树。如何实现 ThreadLocal,既然说让每个线程都拥有自己变量的副本,最容易的方式就是用一个 Map 将线程的副本存放起来,Map 里 key 就是每个线程的唯 一性标识,比如线程 ID,value 就是副本值。什么是 Hash,就是把任意长度的输入(又叫做预映射, pre-image),通过 散列算法,变换成固定长度的输出,该输出就是散列值,输入的微小变化会导致 输出的巨大变化。原创 2023-09-27 16:39:33 · 68 阅读 · 0 评论