自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RocketMQ - SpringBoot整合RocketMQ

只要注入并启动了这个DefaultLitePullConsumer示例后,后续就可以通过template实例的receive方法,来调用DefaultLitePullConsumer的poll方法,主动去Pull获取消息了。为了保证消息至少被消费一次,消息队列 RocketMQ 的服务端将在网络恢复后再次尝试投递之前已被处理过的消息,消费者后续会收到两条内容相同并且 Message ID 也相同的消息。​ 通常,一条消息进入了死信队列,意味着消息在消费处理的过程中出现了比较严重的错误,并且无法自行恢复。

2023-12-04 23:46:33 40

原创 RocketMQ-RocketMQ集群实践

而且更严重的是,如果服务器出现了问题,比如磁盘坏了,那么存储在磁盘上的数据就会丢失。指令另一部分节点作为Slave节点,负责备份Master节点上的数据,这样,当Master节点出现故障时,在Slave节点上可以保留有数据备份,至少保证数据不会丢失。​ 为了便于观察,我们这次搭建一个2主2从的RocketMQ集群,并将主节点和节点都分别部署在不同的服务器上。我们这次采用2m-2s-async的方式搭建集群,需要在worker2和worker3上修改这个文件夹下的配置文件。这种集群存在单点故障。

2023-12-03 23:52:39 110

原创 RocketMQ- 深入理解RocketMQ的消息模型

在消息需要重试时,会先移动到对应的重试Topic中。这样,这些重试的消息有了自己单独的队列,就不会影响到Topic下的其他消息了。由于RocketMQ与消费者端有失败重试机制,所以,只要消息成功发送到RocketMQ了,那么可以认为Branch2.1,Branch2.2,Branch2.3这几个分支步骤,是可以保证最终的数据一致性的。但是,这里还是会造成一种分裂,消息最终是由Consumer来处理,但是消息却是由Broker推送过来的,也就是说,Consumer无法确定自己将要处理的是哪些消息。

2023-12-02 23:58:02 324

原创 Linux-Linux安装JDK及配置环境 及 遇到的问题

下载linux环境对应的JDK的tar.gz包配置JDK环境:编辑 sudo vim /etc/profile在文件的最下方,填写export JAVA_HOME=/usr/local/src/software/jdk1.8export CLASSPATH=.:$JAVA_HOME/lib/tools.jarexport PATH=$JAVA_HOME/bin:$PATH执行生效命令:source /etc/profile执行 java -version

2023-12-01 23:52:53 81

原创 RocketMQ-RocketMQ快速实战及集群原理

​ MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。这个词可以分两个部分来看,一是Message消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。二是Queue队列。队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能力。

2023-11-30 23:48:26 43

原创 Redis-Redis 高级数据结构 HyperLogLog与事务

如果这样的页面很多,那 所需要的存储空间是惊人的。为这样一个去重功能就耗费这样多的存储空间,值 得么?该实现一个明显的问题是内存占用过多,所有从库的连接在主库上是独立的,同样举抛硬币的例子,如果只有一组抛硬币实验,显然根据公式推导得到的。那么基于上面的估算结论,我们可以通过多次抛硬币实验的最大抛到正面的。大家应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行,但是,如果你的页面访问量非常大,比如一个爆款页面几千万的 UV。列中的未执行命令,并不会回滚已经操作过的数据,这一点要和关系型数据库的。

2023-11-29 23:54:44 84

原创 Redis队列stream,Redis多线程详解

积压,到一定程度,会被强制断开,导致消息意外丢失。真正要在生产中应用,要做的事情还很多,比如消息队列的管理和监控就需要花。每个人所感兴趣的事件是不一样的,前台的接待小姐会根据每个人感兴趣的事件。它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系。出异常,所以在编写客户端消费者的时候要小心,如果捕获到异常需要重试。消息一旦发布,不能接收。但是如果并发量很高,资源足够支持下,还是以专业的消息中间件,比如。向反应器注册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体。

2023-11-28 23:57:50 265

原创 Redis-Redis多级缓存架构(实践)

4.分布式读写锁的机制(读读共享,读写互斥,写写互斥)读写锁底层实现的是读写操作都是抢同一把锁,已控制拿锁的顺序。若是读读操作,则底层实现的是可重入锁机制。1.基于缓存,对热点数据进行刷新过期时间,以实现。2.前端有处理失效的情况,那么可考虑使用。如:前端缓存,本地缓存,redis缓存。1.当热点数据突然迸发时,容易出现。3.可对某些不重要的服务可进行做。3.使用分布式读写锁,可解决。“数据库与缓存双写不一致”“热点数据进行缓存重建”场景,则可通过前端进行。

2023-11-27 23:42:17 322 1

原创 Redis-Redis多级缓存架构

以上我们针对的都是读多写少的情况加入缓存提高性能,如果写多读多的情况又不能容忍缓存数据不一致,那就没必要加缓存了,可以直接操作数据库。当然,如果数据库抗不住压力,还可以把缓存作为数据读写的主存储,异步将数据同步到数据库,数据库只是作为数据的备份。放入缓存的数据应该是对实时性、一致性要求不是很高的数据。切记不要为了用缓存,同时又要保证绝对的一致性做大量的过度设计和控制,增加系统复杂性!

2023-11-26 23:54:57 288 1

原创 Redis-Redis 高并发分布式锁

在临界条件下,当程序执行到最后准备释放锁时候,锁的超时时间已到,则此时的锁成为已过期,则释放不了锁。而当下一个线程也来执行任务时,前一个任务将这个任务所拿的所给释放掉了(释放掉不属于自己的锁对象);则引入redisson分布式锁来解决当前的问题,redisson具有锁续命机制。将获取锁的对象和设置的超时的时间分开,则不能控制原子性,如下所示。将获取锁的对象和设置的超时的时间放在一个原子操作里执行时,(若是商品,则可以将商品id作为锁对象)1.使用原生redis控制超卖时。

2023-11-25 23:54:05 397

原创 Spring - Mybatis-设计模式总结

,它属于创建类模式,一般来说,如果一个对象的构建比较复杂,超出了构造函数所能包含的范围,就可以使用工厂模式和Builder模式,相对于工厂模式会产出一个完整的产品,Builder应用于更加复杂的对象的构建,甚至只会构建产品的一个部分。在这个过程中,有一个相似的特点,就是这些Builder会读取文件或者配置,然后做大量的XpathParser解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤,这么多的工作都不是一个构造函数所能包括的,因此大量采用了Builder模式来解决。

2023-11-24 23:54:42 467

原创 Redis-Redis高可用集群之水平扩展

Redis3.0以后的版本虽然有了集群功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,今天就来带大家看看redis高可用集群如何做水平扩展,原始集群(见下图)由6个节点组成,6个节点分布在三台机器上,采用三主三从的模式# 客户端连接8001端口的redis实例# 查看集群状态 从上图可以看出,整个集群运行正常,三个master节点和三个slave节点,8001端口的实例节点存储0-5460这些hash槽,8002端口的实例节点存储5461-1092

2023-11-23 23:34:21 378

原创 Redis-Redis缓存高可用集群

在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。不足在于所有的元数据的更新压力全部集中在一个地方,可能导致元数据的存储压力。

2023-11-22 23:49:45 688

原创 Redis-Redis持久化,主从哨兵架构详解

Redis持久化。

2023-11-21 23:45:52 711

原创 Redis-高性能原理剖析

scan 参数提供了三个参数,第一个是 cursor 整数值(hash桶的索引值),第二个是 key 的正则模式,第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。但是scan并非完美无瑕, 如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。Stats 通用统计数据。

2023-11-20 23:27:06 354

原创 Redis-核心数据结构

五种数据结构String结构String结构应用场景Hash结构Hash结构应用场景List结构List结构应用场景Set结构Set结构应用场景ZSet有序结构ZSet有序结构应用场景

2023-11-20 23:03:08 867

原创 Spring-Spring之事务底层源码解析--实践(流程图)

spring事务流程图

2023-11-19 23:55:02 247

原创 Spring-Spring之事务底层源码解析

所以这个类的主要作用就是。

2023-11-18 23:42:30 149

原创 Spring-Spring之AOP底层源码解析(下)---实践(流程图)

动态代理(基于JDK 或Cglib)流程图。

2023-11-16 23:56:46 17

原创 Spring-Spring之AOP底层源码解析(下)

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

2023-11-15 23:32:52 175

原创 Spring-Spring之AOP底层原理解析---实践(动态代理)

After (finally) advice:方法执行完finally之后执行,这是最后的,比return更后。Around advice:这是功能最强大的Advice,可以自定义执行顺序。After returning advice:方法return后执行。当代理执行 userService.test();After throwing advice:方法抛异常后执行。当代理执行 userService.a();然后执行不同的代理方法test() 和a()Before Advice:方法之前执行。

2023-11-14 23:54:10 132

原创 Spring-Spring之AOP底层原理解析

上面介绍了Spring中所提供了ProxyFactory、Advisor、Advice、PointCut等技术来实现代理对象的创建,但是我们在使用Spring时,我们并不会直接这么去使用ProxyFactory,比如说,我们希望ProxyFactory所产生的代理对象能直接就是Bean,能直接从Spring容器中得到UserSerivce的代理对象,而这些,Spring都是支持的,只不过,作为开发者的我们肯定得告诉Spring,那些类需要被代理,代理逻辑是什么。

2023-11-13 23:18:01 152

原创 Spring -Spring之循环依赖源码解析(实践)---流程图

循环依赖流程图:循环依赖原理:

2023-11-12 23:54:02 14

原创 Spring -Spring之循环依赖源码解析

很简单,就是A对象依赖了B对象,B对象依赖了A对象。// A依赖了Bclass A{public B b;// B依赖了Aclass B{public A a;那么循环依赖是个问题吗?如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。比如a.b = b;b.a = a;这样,A,B就依赖上了。但是,在Spring中循环依赖就是一个问题了,为什么?

2023-11-11 23:46:26 270

原创 Spring -Spring之依赖注入源码解析(下)--实践(流程图)

IOC依赖注入流程图

2023-11-10 23:55:32 764

原创 Spring -Spring之依赖注入源码解析(下)

之前Spring中的和该方法表示,传入一个依赖描述(DependencyDescriptor),该方法会根据该依赖描述从BeanFactory中找出对应的唯一的一个Bean对象。下面来分析一下中**resolveDependency()**方法的具体实现,findAutowireCandidates()实现​。

2023-11-09 23:34:51 85

原创 Spring -Spring之依赖注入源码解析(上)实践(流程图)

IOC依赖注入

2023-11-08 23:54:27 29

原创 Spring -Spring之依赖注入源码解析(上)

方法参数个数为0个,并且 (方法名字以"get"开头 或者 方法名字以"is"开头并且方法的返回类型为boolean)**set方法的定义是:**方法参数个数为1个,并且 (方法名字以"set"开头并且方法返回类型为void)所以,Spring在通过byName的自动填充属性时流程是:找到所有set方法所对应的XXX部分的名字根据XXX部分的名字去获取beanSpring在通过byType的自动填充属性时流程是:获取到set方法中的唯一参数的参数类型,并且根据该类型去容器中获取bean。

2023-11-07 23:28:40 144

原创 Spring-包扫描doScan()流程图 & 生成非懒加载的单例bean的流程图(实践)

doScan流程图

2023-11-04 23:53:33 36

原创 Spring- SpringBean生命周期源码解析

实例化自动注入Aware对象初始化。

2023-11-03 23:54:39 177

原创 并发编程 - PriorityQueue用法

队列是遵循先进先出(First-In-First-Out)模式的,PriorityQueue类在Java1.5中引入并作为的一部分。优先队列中的元素可以默认自然排序或者通过提供的Comparator比较器)在队列实例化的时排序。优先队列不允许空值,而且不支持non-comparable(不可比较)的对象,比如用户自定义的类。优先队列要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。优先队列的头是基于自然排序或者Comparator。

2023-11-03 15:49:45 60

原创 Spring-Spring 之底层架构核心概念解析

我们还可以。

2023-11-02 23:51:33 461

原创 Spring - 手写模拟Spring底层原理

容器类ZSJApplicationContext定义注解@Autowired @Component @Scope @ComponentScan定义后置处理器BeanPostProcessor,用于初始化ZSJBeanPostProcessor实现BeanPostProcessor定义初始化接口InitializingBean

2023-11-01 23:55:25 197

原创 并发编程-CPU缓存架构详解 & Disruptor的高性能设计方案

CPU高 速缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数 据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。如果缓存中没有该数据的副本,则会发出一 个缓存不命中(miss)请求,从主内存中获取该数据的副本,并将该数据的副本存储到自己的缓存 中。不能被缓存在处理器内部的数据通常指的是不可缓存的设备内存(如显存、网络接口卡的缓存 等),这些设备内存一般不受缓存一致性协议的管辖,处理器无法将其缓存到自己的缓存行中。

2023-10-31 23:54:35 448

原创 Spring - Spring底层核心原理解析

1. Bean的生命周期底层原理2. 依赖注入底层原理3. 初始化底层原理4. 推断构造方法底层原理5. AOP底层原理6. Spring事务底层原理对于这三行代码应该,大部分同学应该都是比较熟悉,这是学习Spring的hello world。可是,这三行代码底层都做了什么,比如:第一行代码,会构造一个ClassPathXmlApplicationContext对象,ClassPathXmlApplicationContext该如何理解,调用该构造方法除开会实例化得到一个对象,还会做哪些事情?

2023-10-30 23:53:40 526

原创 并发编程 -常用并发设计模式

2.另一个是仅检查线程的中断状态也是不够的,因为我们依赖的第三方类库很可能没有正确处理中断异常,例如第 三方类库在捕获到 Thread.sleep() 方法抛出的中断异常后,没有重新设置线程的中断状态,那么就会导致线程不 能够正常终止。不变性模式虽然有很多优点,但也有一些限制。fork(),传统的 fork() 函数会创建父进程的一个完整副本,例如父进程的地址空间现在用到了 1G 的内 存,那么 fork() 子进程的时候要复制父进程整个进程的地址空间(占有 1G 内存)给子进程,这个过程是很耗时的。

2023-10-29 23:50:57 112

原创 并发编程 - 并发可见性,原子性,有序性 与 JMM内存模型

一个变量在同一时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次,多次执行 lock后,只有执行相同次数的unlock操作,变量才会被解锁。如果要把一个变量从主内存中复制到工作内存,就需要按顺序地执行read和load操作, 如果把变量从工作内存中同步回主内存中,就要按顺序地执行store和write操作。JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内 存中,每个线程都有一个私有的本地内存,本地内存中存储了共享变量的副本。

2023-10-27 23:57:15 113

原创 并发编程- 线程池ForkJoinPool工作原理分析(实践)

【代码】并发编程- 线程池ForkJoinPool工作原理分析(实践)

2023-10-26 23:58:25 323

原创 并发编程-线程池ForkJoinPool工作原理分析

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

2023-10-25 23:48:15 55

原创 并发编程-线程池ThreadPoolExecutor底层原理分析(二)

其实线程池存在的意 义,就是提前生成好线程资源,需要线程的时候直接使用就可以,而不需要临时去开启线程,所以正 常情况下,开启的核心工作线程是不用回收掉的,就算暂时没有任务要处理,也不用回收,就让核心 工作线程在那等着就可以了。不可能开启的工作线程一直活 着,因为如果任务由多变少,那也就不需要过多的线程资源,所以线程池中会有机制对开启的工作线 程进行回收,如何回收的,后文会提到,我们这里先分析,有没有可能线程池中所有的线程都被回收 了,答案的是有的。a. 如果没有超过,则直接开启新的工作线程执行任务。

2023-10-23 23:50:46 57

空空如也

空空如也

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

TA关注的人

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