自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 秒杀系统设计

2,防止超卖,可以在秒杀活动开始之前把库存数据,商品信息同步到redis缓存,在秒杀时,判断库存是否充足和扣减库存这两个动作使用lua脚本,保证数据原子性,防止超卖。6.订单失败补偿:设置订单失败机制保证订单一定能成功,在秒杀成功后,要保证订单一定处理成功,用MQ进行驱动,失败重试,加报警机制,保证及时监控到报警。3,防止刷子,可以通过限流,用户ID限流,同一IP地址限流,做了限流之后,能够防止一些无效的请求,减轻服务器压力。7,服务降级:服务出现问题,或bug,开启服务降级开关,禁止下单及时止损。

2024-08-31 12:36:09 185

原创 微服务优缺点以及如何拆分

3,数据拆分,在实际的运行过程中也需要考虑服务之间的数据交互,在进行服务拆分的时候,会出现一些公共的数据存在多个服务之间,这个时候可能需要按照一定的原则对数据进行拆分,一般来说数据拆分将划分为单一负责一部分数据的服务,避免多服务之间进行数据交互。在业务划分的基础上可以再进行配套服务的功能拆分,可以选择将某一个服务的相对独立的功能拆解出来单独成服务,在功能的拆分过程中需要考虑拆分后的服务所需的数据存储,运行环境是否能够满足。5,微服务的拆分粒度,2-3个人维护一个微服务。6,一个微服务对一个数据库。

2024-08-31 12:32:18 407

原创 SpringBoot 自动装配原理

Springboot应用的启动类必须使用@SpringBootApplication注解标记该注解包含了@ SpringbootConfiguration ,@EnableAutoConfiguration,和ComponentScan三个注解的功能2,通过@SpringBootConfigurtaion引入了@EnableAutoConfiguration注解@EnableAutoConfiguration 可以启动配置功能,只有加了该注解才会读取我们的配置类,然后进行启动3,@EnableAu

2024-08-30 06:58:21 196

原创 如何处理项目幂等场景

处理幂等场景,通常指的是确保一个操作、一次请求或者一个函数被调用多次时,其结果仍然保持一致,即具有“幂等性”。○ 例如,在支付系统中,如果订单已经支付成功,那么再次提交支付请求时应该返回支付成功的信息,而不是重新处理支付。○ 在执行更新操作时,先读取当前资源的版本号或时间戳,然后将其与之前的值进行比较。○ 例如,在消息队列中,可以使用消息的唯一ID和幂等消费者来确保消息只被处理一次。○ 在执行操作之前,先检查资源的状态,以确定该操作是否应该被执行。○ 在设计API或接口时,应该尽量使接口具有幂等性。

2024-08-29 19:26:37 351

原创 如何优化减少FULL GC

适当增加堆内存大小,可以减少老年代空间不足的情况,从而FULL GC的发生。:适用于大多数应用,特别是那些需要低延迟和较大堆内存的应用。: 适用于需要极低延迟的应用。:适当增加新生代的大小,可以减少对象晋升到老年代的频率,从而减少老年代的压力。减少内存泄漏:确保应用程序内有内存泄漏,检查和修复长生命周期对象的引用问题。缓存和复用对象:使用对象池,缓存和重用对象,减少对象分配和垃圾回收频率。: 尽量减少短生命周期对象的创建,或将其分配在栈上而不是堆上。选择合适的数据结构,减少内存占用和垃圾对象的生成。

2024-08-29 17:22:25 241

原创 jvm什么情况下会产生内存泄漏

尽管java有垃圾回收机制,但仍然肯呢个存在内存泄漏。内存泄漏指的是程序在运行过程中由于一些原因未能释放不再使用的内存,导致内存使用量不断增加,最终可能耗尽可用内存。内存泄漏在java中通常用于程序逻辑错误或者不当的资源管理引起。常见的内存泄漏情况1.静态集合类(hashMap,ArrayList)持有对象引用:静态集合类会在整个应用程序生命周期类存在,如果内有及时清理不再使用的对象引用,这些对象就无法被垃圾回收2.监听器回调函数如果注册的监听器或者回调函数没有解除注册,他们持有的对象引用也会导致

2024-08-29 08:36:17 331

原创 慢sql的优化方向

首先我们会检查查询语句本身,确保使用了合适的索引,避免全表扫描,比如在where,JOIN或order by,group by子句中的列创建索引。最后,持续的监控和调优是必不可少的,使用一些工具,比如PMM或者DATAdog,来监控数据库性能,并定期审查和优化慢sql查询,确保数据库始终保持高效。然后,我们会调整mysql的配置参数,比如增加innodb缓存池的大小,让更多的数据可以缓存在内存中,较少io操作,同时更具需要调整查询缓存的大小。,确保where子句中的条件能够有效利用索引,避免全表扫描。

2024-08-28 15:33:20 202

原创 MQ常见问题

mq主要问题就是消息丢失,重复消费,顺序性等问题,像消息丢失,常见的可能是发送的时候丢失,或者队列丢失,或者消费失败,导致丢失。顺序消费很常见,举个例子,比如先新增,后删除的消息,这种就需要保证顺序消费,造成mq不顺序消费的原因有三个,最常见的是多个消费者并行处理,大家都消费同一消息队列的消息,如果没有特殊的限制,就会造成消息的处理顺序可能会与发送顺序不一致,另外一种就是分区机制,不同的分区内的消息顺序可能会被打乱,还有就是重试,如果消息处理失败时,重试机制重发可能产生影响。在kafka中配置重试机制。

2024-08-22 16:41:01 731

原创 Spring中常用的注解

1,@Component表示一个被Spring托管的组件,通常用于标注业务逻辑类,被标记的类会被自动扫描并加入到Spring容器中,也可以用其他的业务逻辑类来替代,比如Service,Repository和Controller。2,@Autowired自动装配一个Spring托管的组件,可以用在构造函数,属性和setter方法上,Spring会自动为其注入所需的依赖,如果有多个实现类匹配时,可以用Qualifier来指定具体的实现类。3,@QualiFier当一个接口有多个实现类时,用于指定具体的

2024-08-21 08:31:52 203

原创 Spring中用到了哪些设计模式

责任连模式为请求创建了一个接收者对象的连,在这种模式中,通常每个接收者都包含对 另一个接收者的引用,如果一个对象不能处理该请求,那么他会把相同的请求传给下一个接受者,依次类推,在编码中该模式通常以。模版模式就是抽象父类提供一套定义好的方法供子类调用,而其中的某些方法子类根据自己的情况进行定制,就好像平时用模版写东西一样,但是内容却各不相同,在编码中该模式通常以。适配器模式可以作为两个不兼容的接口之间的桥梁,它可以使的原本由于接口不兼容而不能一起工作的类可以一起工作,在编码中该模式通常以。

2024-08-17 16:50:23 169

原创 Spring IOC和DI的理解

Spring ioc 他的全称叫控制反转,在传统的java程序开发里面,我们只能通过new关键字来创建对象这种方式会导致程序里面对象的依赖关系比较复杂,而且耦合度比较高,而IOC的主要作用就是实现了对象的管理,也就是我们把设计好的对象交给IOC容器来控制,然后在需要用到的目标对象的时候直接从容器里面去获取,有了IOC容器来管理bean之后,相当去把对象的创建和查找依赖对象的控制交给了容器,这个设计理念使得对象和对象之间是一种松耦合状态,极大的提升了程序的灵活性,以及功能的复用性。

2024-08-17 16:16:54 114

原创 分库分表

系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间大,以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读Io,产生IO瓶颈。每个表结构不一样,每个表数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键用于关联数据,所有表的并集是全量数据。以表为依据,按照业务归属不同,将不同的表拆分到不同的库中,比如所有配置表存一个库,订单表一个库,用户权限一个库。每个表的结构一样,每个表的数据不一样,没有交集,所有表的并集是全量数据。

2024-08-16 15:15:34 381

原创 11,Mysql 与Redis

简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫作二级索引。由于在 InnoDB 引擎里面,一张表的数据对应的物理文件本身就是按照 B+树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗 B+树,然后叶子节点里面存储了这个表的每一行数据记录。所以基于 InnoDB 这样的特性,聚集索引并不仅仅是一种索引类型,还代表着一种数据的存储方式。

2024-07-27 18:31:20 1017

原创 10.分布式与微服务

幂等是指一个方法被多次重复执行的时候产生的影响和第一次执行的影响相同。之所以要考虑到幂等性问题,是因为在网络通信中,存在两种行为可能会导致接口被重复执行。用户的重复提交或者用户的恶意攻击,导致这个请求会被多次重复执行。在分布式架构中,为了避免网络通信导致的数据丢失,在服务之间进行通信的时候都会设计超时重试的机制,而这种机制有可能导致服务端接口被重复调用。所以在程序设计中,对于数据变更类操作的接口,需要保证接口的幂等性。

2024-07-27 11:57:09 756

原创 9,互联网常用框架

Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。而 Spring Cloud 诞生于微服务架构时代,考虑的是微服务治理的方方面面,另外由于依托了 Spirng、Spirng Boot 的优势之上,两个框架在开始目标就不一致,、Spirng Cloud 是一个生态。两者最大的区别是。而。。

2024-07-21 17:11:43 838

原创 8.Spring Mvc,Spring Boot ,Spring Cloud

 @Autowired 是根据 type 来匹配,@Resource 可以根据 name 和 type 来匹配,默认是 name匹配。 @Autowired 是 Spring 定义的注解,@Resource 是 JSR 250 规范里面定义的注解,而 Spring对 JSR 250 规范提供了支持。 @Autowired 如果需要支持 name 匹配,就需要配合@Primary 或者@Qualifier 来实现。

2024-07-21 10:59:51 1071

原创 7,Spring框架

Spring 解析这些声明好的配置内容,将这些配置内容都转化为 BeanDefinition 对象,BeanDefinition中几乎保存了配置文件中声明的所有内容,再将 BeanDefinition 存到一个叫做 beanDefinitionMap中。以 beanName 作为 Key,以 BeanDefinition 对象作为 Value。之后 Spring 容器,根据 beanName找到对应的 BeanDefinition,再去选择具体的创建策略。而 Spring 具体的创建策略如图所示,

2024-07-21 10:06:40 983

原创 6,设计模式

代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。优点 :代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。缺点 :由于使用了代理模式,因此程序的性能没有直接调用性能高;使用代理模式提高了代码的复杂度。黄牛卖火车票:没有流行网络购票的年代是很喜欢找黄牛买火车票的,因为工作忙的原因,没时间 去买票,然后就托黄牛给你买张回家过年的火车票。这个过程中黄牛就是代理人,火车票就是。

2024-07-14 19:02:56 846

原创 5,I/O与网络编程

简单理解就是在 TCP 协议中,去确定一个客户端连接的组成要素,它包括源 IP 地址、目标 IP地址、源端口号、目标端口号。正常情况下,我们对于网络通信的认识可能是这样(如图)。服务端通过 ServerSocket 建立一个对指定端口号的监听,比如 8080。客户端通过目标 ip 和端口就可以和服务端建立一个连接,然后进行数据传输。但是我们知道的是,一个 Server 端可以接收多个客户端的连接,比如像这种情况(如图)。那,当多个客户端连接到服务端的时候,服务端需要去识别每一个连接。

2024-07-14 18:20:42 846

原创 4,jvm原理

我简单说一下类的加载机制(如图),就是我们自己写的 java 源文件到最终运行,必须经过编译和类加载两个阶段。编译的过程就是把.java 文件编译成.class 文件。类加载的过程,就是把 class 文件装载到 JVM 内存中,装载完成以后就会得到一个 Class 对象,我们就可以使用 new 关键字来实例化这个对象。(如图)而类的加载过程,需要涉及类加载器。JVM 在运行的时候,会产生 3 个类加载器,这三个类加载器组成了一个层级关系。

2024-07-14 18:03:09 929

原创 3.集合原理

最后,我们来总结一下:1、ConcurrentHashMap 在 JDK 1.7 中使用的数组 加 链表的结构,其中数组分为两类,大数组Segment 和 小数组 HashEntry,而加锁是通过给 Segment 添加 ReentrantLock 重入锁来保证线程安全的。2、ConcurrentHashMap 在 JDK1.8 中使用的是数组 加 链表 加 红黑树的方式实现,它是通过 CAS或者 synchronized 来保证线程安全的,并且缩小了锁的粒度,查询性能也更高。

2024-07-14 17:37:50 625

原创 2.并发线程与多线程

CAS 是 Java 中 Unsafe 类里面的方法,它的全称是 CompareAndSwap,比较并交换的意思。它的主要功能是能够保证在多线程环境下,对于共享变量的修改的原子性。我来举个例子,比如说有这样一个场景(如图),有一个成员变量 state,默认值是 0,定义了一个方法 doSomething(),这个方法的逻辑是,判断 state 是否为 0 ,如果为 0,就修改成 1。

2024-07-14 16:00:09 615

原创 java面试题第一章基础知识

发生内存溢出。我们来看到右侧的区域,假设我们 JVM 中可用的内存空间只剩下 3M,但是我们要创建一个 5M 的对象,那么,新创建的对象就放不进去了。这个时候,我们就叫做内存溢出。就好比是一个容量只有 300ml的水杯,我们硬要往里面倒 500ml 的水,这时候,水就会溢出,倒不进去了,这就相当于是内存的溢出。它代表业务代码执行时,所需要占用的内存空间。这段业务代码中创建了两个 1M 的对象,一起会占用 2M 内存。

2024-07-13 13:50:48 882

原创 seata事物的理解

TCC 模式,TCC 事务是 Try、Confirm、Cancel 三个词语的缩写,简单理解就是把一个完整的业。AT 模式,是一种基于本地事务+二阶段协议来实现的最终数据一致性方案,也是 Seata 默认的解。3. 在分布式事务的实现上,对于强一致性,我们可以通过基于 XA 协议下的二阶段提交来实现,对于。a. 强一致性,就是所有的事务参与者要么全部成功,要么全部失败,全局事务协调者需要知道每。b. 最终一致性,也叫弱一致性,也就是多个网络节点的数据允许出现不一致的情况,但是在最终。

2024-07-10 09:59:45 176

原创 fail-safe 机制与 fail-fast 机制分别有什么作用

java.util 包下的集合类都是快速失败机制的, 常见的使用 fail-fast 方式遍历的容器有 HashMap 和。定义一个 Map 集合,使用 Iterator 迭代器进行数据遍历,在遍历过程中,对集合数据做变更时,就会。Fail-fast : 表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出。原因是采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内。Fail-safe,表示失败安全,也就是在这种机制下,出现集合元素的修改,不会抛出。

2024-07-10 09:55:31 206

原创 谈谈你对 AQS 的理解

线程中只能有一个线程获得锁资源,比如 Lock 中的 ReentrantLock 重入锁实现就是用到了 AQS 中的。Hello,大家好, 我是 Mic, 一个工作了 14 年的程序员,今天来和大家聊聊并发编程中的 AQS 组件。在很多大厂的面试中,面试官对于并发编程的考核要求相对较高,简单来说,如果你不懂并发编程,那。等都用到了 AQS. 从本质上来说,AQS 提供了两种锁机制,分别是排他锁,和 共享锁。我们来看一下,关于谈谈你对 AQS 的理解“,看看普通人和高手是如何回答的!

2024-07-10 09:48:24 104

空空如也

空空如也

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

TA关注的人

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