自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 synchronized锁升级的过程

在Java中,锁的状态分为四种,分别是无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。

2024-03-19 15:54:52 121

原创 kafka什么情况下会认为发送失败进而去重试

在Kafka中,发送消息的过程是异步的,即消息后不会立即得到发送结果。Kafka会将消息添加到发送缓冲区,并立即返回一个成功的响应。因此,Kafka并不会直接知道消息是否成功发送到了目标主题的分区。需要注意的是,Kafka的重试机制是有限制的。在重试过程中,如果达到了最大重试次数或者超过了最大重试时间,Kafka会放弃重试,并将消息标记为发送失败。

2024-03-18 16:51:07 618

原创 @Lazy注解解决循环依赖和三级缓存的区别

Lazy注解是Spring框架提供的一种解决循环依赖问题的方式。当两个或多个Bean之间存在循环依赖时,可以使用@Lazy注解延迟初始化其中一个Bean,从而打破循环依赖。因为spring的三级缓存只能解决上面这两种循环依赖,还有其他的循环依赖无法解决。解释:就在是创建bean的时候,先创建InstanceC,后创建InstanceA。

2024-03-18 16:37:44 375

原创 数据库四大特性的实现原理

指维护一个数据的多个版本,使得读写操作没有冲突MVCC的具体实现,主要依赖于数据库记录中的。回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和 MVCC(多版本并发控制)。当update一条记录时,它记录一条对应相反的update记录。当执行roback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。可以认为当delete一条记录时,undolog中会记录一条对应的insert记录,反之亦然。主要依赖于unlog,undo log保证了事务的原子性和一致性。

2024-03-18 15:55:04 329

原创 Mysql关于同时使用Group by 和Order by问题

SELECT * FROM (SELECT * FROM reward ORDER BY money desc limit 10000000000000)r GROUP BY r.uid // 但是此写法性能可能有问题。结果不符合预期:发现“mysql 5.7 中order by 和GROUP BY 一起使用 order by 不生效”,必须加上limit限制 ,避免系统会把order by优化掉。(第二次尝试)构建sql语句。

2024-03-14 14:17:41 526

原创 mysql设计过程中要考虑哪些要素

4、选择合适的字段类型和字段长度。

2024-03-14 11:35:09 323

原创 遍历list过程中调用remove方法

List调用remove(index)方法后,会移除index位置上的元素,之后的所有元素依次前移,当移除完【张三】时,【李四】变成了数组的第一位,此时的索引应该要index-1才能获取到【李四】。foreach循环实际上是迭代,使用list.remove(item)方法后,list 对象的modCount值进行了修改,而 list对象的迭代器中的expectedModCount值没有修改,所以抛出了异常。当前遍历对象===张三。当前遍历对象===王五。当前遍历对象===赵六。当前遍历对象===张三。

2024-03-13 11:56:22 991

原创 什么是死信队列

当消息满足特定条件时,比如消息被拒绝、消息过期或者队列达到最大长度等,这些消息就会被发送到死信队列中。通过使用死信队列,我们可以对无法正常处理的消息进行特殊处理,比如记录日志、统计失败次数、发送告警通知等。当队列已经达到最大长度,新的消息无法进入队列时,这些新消息可能会被发送到死信队列,以便给予特别处理或记录日志。如果消息设置了过期时间,并且在此时间内没有被消费者处理,那么该消息可能会成为死信,被发送到死信队列中。当消费者拒绝消费消息并且不将其重新放回原始队列时,消息可能会被发送到死信队列。

2024-03-11 12:02:21 411

原创 为什么Elasticsearch对内存要求比较高

ES是比较依赖内存的,并且对内存的消耗也很大,内存对ES的重要性甚至是高于CPU的,所以即使是数据量不大的业务,为了保证服务的稳定性,在满足业务需求的前提下,我们仍需考虑留有不少于20%的冗余性能。一般来说,按照百万级、千万级、亿级数据的索引,我们为每个节点分配的内存为16G/32G/64G就足够了,太大的内存,性价比就不是那么高了。对于ES来说,磁盘可能是最重要的了,因为数据都是存储在磁盘上的,当然这里说的磁盘指的是磁盘的性能。磁盘性能往往是硬件性能的瓶颈,木桶效应中的最短板。

2024-03-07 17:22:00 512

原创 kafka和ZK的关系

创建broker后,向zk注册新的broker信息,以及监测 partition leader存活性,实现在服务器正常运行下的水平拓展,Topic的注册,zk会维护broker与topic的关系,通过/brokers/topics/topic.name节点来记录。只是能够提供当前broker的相关信息,Producer向zookeeper中注册watcher,了解topic的partition的消息,以动态了解运行情况,实现负载均衡。ZooKeeper充当了Kafka集群的协调者,确保集群的稳定运行。

2024-02-22 11:15:08 639

转载 Redis Cluster故障转移原理

如果一个节点收到了某个节点失联的数量 (PFail Count) 已经达到了集群的大多数,就可以标记该节点为确定下线状态 (Fail),然后向整个集群广播,强迫其它节点也接收该节点已经下线的事实,并立即对该失联节点进行主从切换。当某个节点判断另一个节点主观下线后,相应的节点状态会跟随消息在集群内传播,通过Gossip消息传播,集群内节点不断收集到故障节点的下线报告。故障节点变为客观下线后,如果下线节点是持有槽的主节点则需要在它的从节点中选出一个替换它,从而保证集群的高可用。都标记某个节点是主观下线时。

2024-02-20 17:05:49 119

原创 线程池——Executor、Executors、ExecutorService、ThreadPoolExecutor、ThreadPoolTaskExecutor之间的区别

java.util.concurrent.Executor 负责线程的使用和调度的根接口|–ExecutorService 子接口: 线程池的主要接口|–ThreadPoolExecutor 线程池的实现类|–ScheduledExceutorService 子接口: 负责线程的调度|–ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor,实现了ScheduledExecutorService。

2024-01-31 15:27:10 526

原创 spring Bean的生命周期

在Bean初始化之前,允许自定义的BeanPostProcessor对Bean实例进行处理,如修改Bean的状态BeanPostProcessor的postProcessBeforelnitialization方法会在此时被调用.由AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsBeforelnitialization万执行。如果Bean在配置文件中定义了销毁方法,那么该方法会被调用。Spring容器注入必要的属性到Bean中。

2024-01-31 12:31:08 375

原创 类的加载机制

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

2024-01-16 20:28:29 400

原创 微服务理解

订单服务下单需要调用库存服务校验库存,库存扣减成功后需要调用订单服务接口进行通知,这就是循环依赖危害:1、流量放大: 因为系统之间存在循环依赖,那么就会导致本来下单系统可能只有100 QPS,但是因为存在循环依赖,就会导致这个QPS被放大,因为100个请求调用到订单服务,订单服务就有100个请求调到库存服务,而库存服务又有100个请求再调到订单服务。就导致订单服务有200的QPS了。无形中被放大了流量。2、性能问题。

2024-01-15 11:41:54 383

原创 char和varchar的区别

varchar是一种可变长度的数据类型,它只会存储实际的字符串内容,不会填充空格。因此,在存储短字符串时,varchar可以节省空间。varchar的长度范围是0-65535 (MySQL 5.0.3之后的版本)。char是一种定长的数据类型,它的长度固定且在存储时会自动在结尾添加空格来将字符串填满指定的长度。对于字段值经常改变的数据类型来说,CHAR 相比 VARCHAR 也更有优势,因为 CHAR 的长度固定,不会产生碎片。char和varchar都是用于在数据库中存储字符串的数据类型。

2024-01-15 10:48:54 362

原创 spring的事物传播机制

在复杂的业务场景中,多个事务方法之间的调用可能会导致事务的不一致,如出现数据丢失、.重复提交等问题,使用事务传播机制可以避免这些问题的发生,保证事务的一致性和完整性。Spring的事务规定了7种事务的传播级别,默认的传播机制是REQUIRED。Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。

2024-01-14 20:10:03 376

原创 Spring Bean初始化方式

假设类UserController有个成员变量UserService被**@Autowired**修饰,那么UserService的注入是在UserController的构造方法之后执行的。InitializingBean是Spring提供的拓展性接口,InitializingBean接口为bean提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。**总结:**类初始化调用顺序:构造方法。

2024-01-14 20:05:17 437

原创 dubbo如何实现像本地方法一样调用远程方法

在配置文件中指定了要使用的通信协议后,Dubbo 会根据协议的不同,选择不同的序列化方式,将请求消息序列化成二进制流并发送给服务提供方。,当客户端发起远程调用后,服务提供方接收到请求后,会根据请求中的服务接口名和方法名,找到对应的实现类和方法,并将请求消息反序列化成参数列表,最终调用服务实现类的方法,并将执行结果序列化成响应消息返回给客户端。Dubbo 使用JDK 动态代理或者字节码增强技术,生成一个代理类,该代理类实现了本地接口,具有本地接口的所有方法。

2024-01-14 19:47:53 478

原创 dubbo服务调用流程

Dubbo的整体架构中,有多个角色,分别是服务提供者,服务调用者以及服务注册中心。一次完整的服务调用过程其实要分为服务注册、服务发现和服务调用三个过程。

2024-01-14 19:18:01 525

原创 Dubbo的优势

在异构系统(跨语言和跨平台),HTTP具有更好的兼容性,因为HTTP是一种通用的协议,几乎所有的编程语言和操作系统都支持HTTP协议,而不是所有的编程语言和操作系统都支持相同的RPC协议。性能好: RPC在传输效率上通常比HTTP更高,此外,RPC可以使用更紧凑的数据格式,如ProtocolBuffers和Thrift,可以更有效地利用网络带宽和存储空间。RPC适合用在企业内部,要求使用同一套注册中心进行服务治理,如果是跨组织,或者跨公司,这种情况只能用更加通用的HTTP进行通信。

2024-01-14 18:46:36 418

原创 秒杀系统如何设计

秒杀是可以提前预知哪些数据会变成热点的,所以可以提前做一些缓存的预热,对于热点数据,不仅需要在Redis中做预热,还需要在本地缓存也做预热,避免Redis的热key问题。有的时候,我们不能只想着用技术手段解决所有问题,其实,如果在业务上能做点事情的话,如果这些做法并不影响用户体验,那么就可能让技术实现上大大简化方案,整个系统的成本和稳定性也会有大大的提高。秒杀系统,会在前端,也就是客户端层面做一些请求的随机丢弃,这些被丢弃的请求就直接返回失败,或者系统繁忙,让用户重试。的功能,其实也是有这方面的考虑的。

2024-01-14 17:25:45 436

原创 kafka为什么快

3、页缓存: Kafka 将其数据存储在磁盘中,但在访问数据时,它会先将数据加载到操作系统的页缓存中,并在页缓存中保留一份副本,从而实现快速的数据访问。1、批量发送: Kafka 通过将多个消息打包成一个批次,减少了网络传输和磁盘写入的次数,从而提高了消息的吞吐量和传输效率。1、零拷贝技术:Kafka 使用零拷贝技术来避免了数据的拷贝操作,降低了内存和 CPU 的使用率,提高了系统的性能。2、异步发送: 生产者可以异步发送消息,不必等待每个消息的确认,这大大提高了消息发送的效2.率。

2024-01-14 15:57:47 693

原创 为什么要用B+树

在节点分裂和合并时,IO操作少:B+树的叶子节点的大小是固定的,而且节点的大小一般都会设置为一页的大小,这就使得节点分裂和合并时,IO操作很少,只需读取和写入一页。支持范围查询:B+树在进行范围查询时,只需要从根节点一直遍历到叶子节点,因为数据都存储在叶子节点上,而且叶子节点之间有指针连接,可以很方便的进行范围查询。有利于缓存:B+树的非叶子结点只存储执行子节点的指针,二步存储数据,这样可以使得缓存能搞容纳更多的索引数据,从而提供缓存的命中率,加快查询速度。节点大小固定,可以存储更多的索引数据。

2024-01-14 15:30:46 829

原创 MySQL的多版本并发控制(MVCC)

在InnoDB中,MVCC就是通过Read View + Undo Log来实现的,undo log中保存了历史快照,r而Read View用来判断具体哪一个快照是可见的。

2024-01-14 13:42:34 1014

原创 数据库的连接池有哪些

Apache Commons DBCP:Apache Commons DBCP是一个流行的开源数据库连接池,它提供了一组可配置的参数来管理连接池的大小、最大活动连接数、最大空闲连接数等。Tomcat JDBC Pool:Tomcat JDBC Pool是Apache Tomcat服务器的官方数据库连接池,它提供了高性能和可靠性,并且与Tomcat服务器紧密集成。C3P0:C3P0是另一个常用的Java数据库连接池,它支持连接池的自动管理和连接的重用。它还支持连接池的动态调整和连接的自动回收。

2024-01-12 08:31:00 524

原创 mysql索引失效场景与mysql优化方式

缓冲池大小是Innodb存储引擎的核心参数之一,它控制着Innodb存储引擎的内存大小,可以将该参数设置为系统可用内存的70%-80%,在选择要创建的索引时,请考虑查询频率和查询性能。:尽可能使用简单的查询语句,并确保使用索引来过滤数据,以减少查询时间。:优化数据库设计可以提高查询性能和数据完整性,如使用正规化的表设计。:定期清理不需要的数据和记录可以减少数据库的负载,并提高查询性能。:对于经常访问的查询结果,可以考虑使用缓存技术,如 redis。:将表分为较小的分区可以提高查询性能,并减少查询时间。

2024-01-11 20:12:27 890

原创 聚簇索引与非聚簇索引

聚集索引的数据文件只有数据结构文件.frm和数据文件.idb,其中.idb中存放的是数据和索引信息,是存放在一起的。非聚集索引的叶节点存储的是索引值和指向对应数据行的指针,而非叶子节点存储的是索引值和指向下一级节点的指针。叶子节点用指针连接起来,叶子节点包含全部索引值,而非叶子节点的索引值只是叶子节点的冗余。聚簇索引和非聚簇索引是数据库中常用的两种索引类型,它们的区别在于索引的顺序是否与数据的物理存储顺序一致。因此,索引的叶子节点和非叶子节点存储的内容是不同的,具体存储的内容也与索引的类型有关。

2023-12-07 11:07:23 443

原创 spring和springBoot

Spring框架解决了企业级的开发的复杂性,它是一个容器框架,用于装java对象(Bean),使程序间的依赖关系交由容器统一管理,松耦合,提高了可测试性和维护效率,Spring主要为我们做了两件事,一省去了我们创建对象的操作,二声明了属性赋值。,有时候配置起来十分麻烦,降低了编程效率。总体而言,Spring框架就是为我们解决开发中的基础性问题,使我们开发者可以更加专注于应用程序的开发,并且Spring框架是轻量级框架,扩展性强,非侵入式框架,消耗的资源少,占用的空间小,运行和部署简单。

2023-11-29 21:07:23 518

原创 springBoot

我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。,@ComponentScan这三个注解。

2023-11-29 20:06:35 1019

原创 RocketMq批量拉取消息失败处理

Consumer的MessageListenerConcurrently监听接口的consumeMessage()方法的第一个参数为消息列表,但默认情况下每次只能消费一条消息。若要使其一次可以消费多条消息,则可以通过修改Consumer的consumeMessageBatchMaxSize属性来指定。不过,该值不能超过32。因为默认情况下消费者每次可以拉取的消息最多是32条。若要修改一次拉取的最大值,则可通过修改Consumer的pullBatchSize属性来指定。

2023-11-29 19:26:53 612

原创 jdk动态代理和CGLIBE代理

因此,事物是动态代理是JDK动态代理还是CGLIB代理,需要根据具体实现方式来确定。如果是通过Java反射机制动态生成字节码,则是JDK动态代理;使用jdk的反射机制,创建对象的能力,创建的是代理类的对象。jdk动态代理,必须有接口,目标类必须实现接口,没有接口时,需要使用cylib动态代理。而CGLIB动态代理机制则是通过继承目标类并生成其子类的方式实现动态代理。**动态:**在程序执行时,调用JDK提供的方法才能创建代理类的对象。实现动态代理的方式通常有JDK动态代理机制和CGLIB动态代理机制。

2023-11-29 18:25:23 406

原创 spring的事物

然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。那回到一开始的问题,我们调用的方法A不带注解,因此代理类不开事务,而是直接调用目标对象的方法。当进入目标对象的方法后,执行的上下文已经变成目标对象本身了,因为目标对象的代码是我们自己写的,和事务没有半毛钱关系,此时你再调用带注解的方法,照样没有事务,只是一个普通的方法调用而已。

2023-11-29 17:47:39 513

原创 Redis集群模式

Cluster模式是Redis的一种高级集群模式,它通过数据分片和分布式存储实现了负载均衡和高可用性。通过对数据的分片,Cluster模式可以突破单节点的内存限制,实现更大规模的数据存储。哨兵节点是一种特殊的Redis节点,它会监控主节点和从节点的运行状态。当主节点发生故障时,哨兵节点会自动从从节点中选举出一个新的主节点,并通知其他从节点和客户端,实现故障转移。是Redis的一种基本集群模式,它通过将一个Redis节点(主节点)的数据复制到一个或多个其他Redis节点(从节点)来实现数据的冗余和备份。

2023-11-29 16:43:00 444

原创 MySQL用得好好的,为何要转ES?

MySQL是一种关系型数据库,它可以高效地存储和查询结构化的数据。ES是一种分布式搜索引擎,它可以快速地对海量的非结构化或半结构化的数据进行全文检索和分析。MySQL和ES的应用场景和优势各不相同,因此在选择使用哪种技术时,需要根据具体的业务需求和数据特点进行权衡。一般来说,如果数据主要是结构化的,且需要保证事务性、一致性和完整性,那么MySQL可能是更合适的选择。如果数据主要是非结构化或半结构化的,且需要支持复杂的搜索、聚合和分析功能,那么ES可能是更合适的选择。

2023-11-28 13:05:41 538

原创 Mysql的二阶段提交

总的来说,在崩溃恢复后,只要redo log不是处于commit阶段,那么就拿着redo log中的XID去binlog中寻找,找得到就提交,否则就回滚。可以看到,InnoDB在写redo log时,并不是一次性写完的,而有两个阶段,Prepare与Commit阶段,这就是"两阶段提交"的含义。如果在写入binlog后立马崩溃,在恢复时,由redo log中的XID可以找到对应的binlog,这个时候直接提交即可。首先比较重要的一点是,在写入redo log时,会顺便记录XID,即当前事务id。

2023-11-28 12:19:53 981

原创 Redis内存满了会宕机吗

需要注意的是,当 Redis 内存数据满了时,如果没有采取相应的措施处理,继续写入操作可能会导致数据丢失或异常。因此,为了确保 Redis 的正常运行,你应该密切关注内存使用情况,并根据实际需求进行配置,包括设置合理的最大内存限制、选择适当的淘汰策略和持久化策略。当数据满时,根据配置的淘汰策略,Redis 可能会自动删除一些数据来腾出空间。持久化策略: 如果 Redis 配置了持久化(如 RDB 或 AOF),当内存数据满时,Redis 可以将数据持久化到磁盘,从而腾出内存空间。

2023-11-19 15:38:33 301

原创 Rocket如何实现顺序消费

在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用。广播消费:当使用广播消费模式时,每条消息推送给集群内所有的消费者,保证消息至少被每个消费者消费一次。,生产者在发送消息的时候,可以对消息设置一个路由ID,比如想保证一个订单的相关消息有序,那么就使用。,根据取余结果选择消息队列,这样同一个订单的数据就可以保证发送到一个消息队列中,消费者类实现。订单ID当做路由ID。

2023-11-19 12:04:55 232

原创 springBoot中starter

项目引入xxljob,仅需要导入对应的starter包,即可进行快速开发。

2023-11-18 12:56:57 166

原创 ConcurrentHashMap

ConcurrentHashMap和HashMap一样,是一个存放键值对的容器。使用hash算法来获取值的地址,因此时间复杂度是O(1)。查询非常快。同时,ConcurrentHashMap是线程安全的HashMap。专门用于多线程环境。

2023-11-15 13:54:49 49

空空如也

空空如也

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

TA关注的人

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