自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JS基础(一) 变量的声明和类型判断

变量提升其实就是会把全局变量的声明放到全局头部,并赋值为undefined,如果是函数里面用var,会把声明放到函数头部,并赋值为undefined。

2025-01-16 21:42:42 403 1

原创 延迟队列实现及其原理详解

时间轮其实就是利用一个环形队列来表示时间,队列上的每个元素挂载了在这个时间刻度上需要执行的任务。可以看出,延迟队列主要包括两个部分,分别是存储任务的数据结构(可以是内存队列,redis,数据库,mq等),还有就是需要线程,来推送扫描队列中的任务。万变不离其宗。

2024-10-19 15:26:26 1873 10

原创 排序算法总结

排序是算法题中常见的操作,本文将介绍各种排序算法的思想和实现。

2024-08-19 21:46:47 285 5

原创 Mysql原理与调优-事务与MVCC

事务其实就是对Mysql的一系列操作,它要求满足4个性质,分别是A(原子性)、C(一致性)、I(隔离性)、D(持久性)。接下来我们来分别介绍一下这4个性质的含义。原子性,表示对于事务里面的操作是一个整体,要么同时成功,要么同时失败。比如A给B转账,A减少50,B加50,这一操作是一个整体。由redo log和undo log共同保证。持久性,表示的事务一旦提交,便会持久化到磁盘中。这一操作由redo log保证。隔离性,表示不同的事务之间是不相互影响的。

2024-08-18 11:43:11 1342 4

原创 Mysql原理与调优-如何进行sql优化

当执行时间超过某个阈值或者某些sql未走索引,会被加入到慢sql日志中。Mysql的优化器在根据各种成本计算过后,会为该条sql生产一个执行计划。这个执行计划包含了表的驱动关系,最终执行的索引,大概得扫描行等。根据,执行计划,我们可以知道执行器最终是如何执行sql的,选择的索引是什么或者索引失效的原因是什么。我们可以通过explain关键字查询执行计划。explain sql语句主要是where条件有多个条件,条件之间or或者and连接,条件针对的是不同的列并且每个列都有索引。

2024-08-17 12:51:53 1280 3

原创 Mysql原理与调优-Mysql的内存结构

BufferPool是一块连续的内存区域,主要用来缓存已经从磁盘加载的页。Buffer Pool主要主要由数据页buffer和change buffer、log buffer三部分组成。而数据页buffer主要存储两部分内容,控制块和数据页。数据页其实就是从磁盘中加载出来的数据内容。控制块是存储数据页的一些元信息,比如页所属的表空间号,页号等。其中数据页部分大小可以通过innodb_buffer_pool_size这个参数进行控制,默认大小为16kb。

2024-08-15 08:00:00 794 5

原创 Mysql原理与调优-索引原理及使用

如图所示,B树满足如下特征:1.B树种的每条数据为一个[key,value]的形式,并且每个节点可以存储多条数据;2.B树每个节点内元素按照key从小到大排列;3.对于B树的分支节点,每个节点的key值构成多个范围,比如上图父节点将区间分为=108,而他们的所对应的子节点key的范围应该介于上述区间内。如图所示,B+树有如下特点:1.B+树有叶子节点和非叶子节点之分,非叶子节点值存储key值,非叶子节点存储key值和value值。

2024-08-14 01:11:51 1392 5

原创 Mysql原理与调优-InnoDB页结构

综上,结合前一章,Mysql的记录的讲解,我们可以对数据是如何存储在Mysql中的有一个大概认识。即每页大小为16kb,通过文件头的前向指针和后向指针,链接成一个双端链表。链表内部,每条记录物理上顺序插入,在逻辑上回根据记录的next_record属性,串成一个按照主键大小排列的单向链表。为了查询更快,每页会维护一个页目录,将记录组成的单向链表分成不同的组,并且将每组的最大元素的偏移量记录在页目录数组中。

2024-08-06 21:51:06 913 4

原创 Mysql原理与调优-InnoDB行记录结构

当我们插入的一条数据的时候,mysql为了做持久化,是将数据存储在磁盘中的。如果mysql每次只查询一条数据,这样效率太低。所以mysql每次从磁盘中读取数据是以页为单位的,每页大小为16kb。而一页数据包含多条记录,接下来我们来看看Mysql中记录是如何存储的。

2024-08-05 22:49:05 842 5

原创 一文搞懂网络IO和java中的IO模型

本文主要介绍了网络中的几种IO模型,并且分析了他们的优缺点。在现在各种框架中,最常用的还是IO多路复用这一模型。同步阻塞IO和同步非阻塞IO在整个过程中,可以认为用户进程是阻塞的,这两种模型的吞吐量是相对较低的。信号驱动IO在等待数据的过程中是非阻塞的,异步IO在整个过程中都是非阻塞的。按理想情况,这两种IO模型应该是吞吐量很大的,但是如果在并发很高的场景下,可能导致内核进程为特别多的信号监听fd,导致吞吐量降低。

2024-07-31 00:45:18 860 3

原创 分布式事务解决方案(一) 2PC、3PC、TCC、Sega

本文讲了,2PC、3PC、TCC、Sega这4中分布式事务的实现方式,它其实对应的就是seata的AT、XA、TCC和sega模式。上述四种方式都是2pc的变种,他们都支持事务执行失败或者成功。这是后文将要介绍的通过消息方式来保证最终一致性的方式的本质区别。那他们分别适合于什么场景呢?XA模式是标准的2PC,在第一阶段会锁定资源,在第二阶段才会进行提交,所以它的一致性是最强的,但是性能相对偏低。

2024-07-29 22:11:57 1321 3

原创 分布式相关理论详解

分布式系统就是将整个系统根据业务拆分多个微服务,服务之间通过Rpc进行通信。集群是将多个相同应用部署到不同的集群模式上,本质上是为了提高吞吐量已经保证高可用性。CAP理论是分布式系统的理论基础,即一个分布式系统最多满足CAP这三项中的两项。即只能满足一致性(Consistance)、可用性(Aviablity)、分区容忍性(Partition tolerance)中的两项。线性一致性是要求最高的一种一致性,他要求无论从哪个副本读取数据,一定读到的是当前整个集群里面最新的数据。

2024-07-25 00:32:48 1739 7

原创 redis原理之底层数据结构-跳表

链表是在程序设计中最常见的数据结构之一,它通过指针将多个链表节点连接起来,这样就可以将逻辑上同一类的数据存储到不连续的内存空间上。链表结构如下:但是链表有一个问题,就是当链表需要查询一个元素的时候,需要从链表头部开始遍历,时间复杂度为o(n)。

2024-07-23 23:25:50 967 3

原创 Redis的使用(五)常见使用场景-分布式锁实现原理

为了解决并发问题,我们可以通过加锁的方式来保证数据的一致性,比如java中的synchronize关键字或者ReentrantLock,但是他们只能在同一jvm进程上加锁。现在的项目基本上都是分布式系统,如何对多个java实例进行加锁,这就需要用到分布式锁。分布式锁可以由多种实现方式,本文将要介绍的就是采用redis实现的方式。

2024-07-19 01:25:31 1370 2

原创 redis原理之底层数据结构(四)-字典

字典是一个由两个hash表组成的数据结构,hash表其实就是类似java的hashTable,所以hashTable是由多个hash entry组成。为什么字典是由两个hash表组成呢,它的数据结构是怎样的呢?我们后面将会讨论。

2024-07-17 22:32:57 226 2

原创 redis原理之底层数据结构(三)-quicklist

前面讲过的ziplist在查找元素的时候是o(n)的复杂度,如果ziplist长度太长,会导致查找元素很缓慢,而ziplist是拥有内存连续的优势,为了保留ziplist内存连续的优势,但是又不能保留太长的长度,我们出现了quicklist,quicklist其实就是将多个ziplist通过指针链接成一个双端链表。

2024-07-16 22:03:37 541 2

原创 redis原理之底层数据结构(二)-压缩列表

压缩列表是redis最底层的结构之一,比如redis中的hash,list在某些场景下使用的都是压缩列表。接下来就让我们看看压缩列表结构究竟是怎样的。

2024-07-15 21:12:45 722 3

原创 Redis的使用(四)常见使用场景-缓存使用技巧

缓存穿透就是,当客户端访问缓存时,发现缓存中没有数据,然后去访问数据库,但是数据库中也没有数据。所以在读取数据的时候,因为数据库中没有数据给redis缓存,所以请求会一直到数据库中,导致数据库压力过大。缓存雪崩就是在某一个时刻大量的key同时过期或者redis直接宕机,导致大量请求涌入到数据库,数据库压力激增。缓存击穿就是在高并发场景下,因为热点key(这里热点key可以指访问频率高或者重建缓存时间长的key)过期,导致大量线程同时重建缓存。

2024-07-12 22:23:43 928 2

原创 redis原理之底层数据结构(一)-动态字符串sds

可以看出redis的sds其实就相当于java中的ArrayList,都具有动态扩容,缩容等功能。

2024-07-11 20:27:59 614 4

原创 Redis的使用(三)常见使用场景-session共享

传统方式是在用户登录过后,用户会校验登录是否成功,如果登录成功,会将用户信息保存到session中,后面用户再次访问的时候,会通过cookie的方式将用户的sessionid携带过来,如果用户在session中根据sessionId查询到用户信息,便表示当前用户已经登录过。1.用于用户信息是存储在session中的,而session是属于一个Tomcat实例,如果采用分布式部署的话,当请求到tomcat1的话,保存到tomcat1的话,下次登录请求到tomcat2的话,便查询不到用户信息。

2024-07-09 23:07:27 1398 2

原创 Redis的使用(二)redis的命令总结

这一小节,我们主要来研究一下redis的五大类型的基本使用,数据类型如下:redis我们接下来看一看这八种类型的基本使用。,同时我们也可以用help 数据类型查看命令的帮助文档。

2024-07-02 20:19:32 358 5

原创 Redis的使用(一)概述

本文主要介绍了redis的一些特点和作用,并且和Memcached进行了对比,后面我们将来探讨redis的具体使用以及每个高级特性是如何实现的。

2024-07-01 20:02:40 586 4

原创 深度解析RocketMq源码-消息推送、持久化、消费全流程

至此,消费者从产生到存储,再到消费的怎个逻辑我们应该是很清晰了。在生产端,生产者根据负载均衡策略(比如轮询或者一致性hash等)选择对应的messagequeue所在的broker中,然后通过Netty,将消费发送broker去;broker收到消息过后,会直接将消息持久化到commitLog中,然后再单独的启动一个线程,根据持久化的commitLog建立IndexFile和consumequeue,并且会唤醒因为长轮询阻塞的消费线程,通过Netty将消发送到consume中;

2024-06-30 00:30:07 1853 4

原创 深度解析RocketMq源码-消费者索引ConsumeQueue

至此,我们已经大概了解消息在进入到broker过后做了什么。在生产者推送消息到broker过后,为了保证数据的能够快速的持久化,是直接按照到达顺序写入到commitLog中的,然后就会给主线程返回生产消息成功的通知。但是消费者需要根据topic和queueId获取到一条消息,并且需要根据消息的key检索一条消息。为了满足上述两个需求,rocketmq会启动一个线程,扫描commitLog,如果有新的消息写入,便会构建IndexFile和consumequeue两个文件,其实相当于两个索引文件。

2024-06-28 21:49:00 1355 5

原创 深度解析RocketMq源码-IndexFile

在工作中,我们经常需要根据msgKey查询到某条日志。但是,通过前面对commitLog分析,producer将消息推送到broker过后,其实broker是直接消息到达broker的先后顺序写入到commitLog中的。我们如果想根据msgKey检索一条消息无疑大海捞针,所以们需要像数集一样建立一个目录,我们其实可以想到的是构建一个Map,key存储msgKey,value存储msg在commitLog中的物理偏移量。而这个目录其实就是indexFile。

2024-06-27 23:24:05 1006 6

原创 深度解析RocketMq源码-高可用存储组件(四)Dledger框架日志同步流程

在中讲过,raft协议中,日志同步主要有两个地方,一个是leader会跟follower同步数据,另一个是在新leader诞生的时候,会与以前的follower进行日志匹配,作一致性校验。而在Dledger的进行日志校验的组件就是DLedgerEntryPusher,接下来我们将探索该组件的源码。

2024-06-26 21:03:23 636 4

原创 深度解析RocketMq源码-高可用存储组件(三)Dledger框架选举流程

当超过一定时间follower未接收到leader的心跳包过后,便会更改自己的状态为candidate,并且开始选举。其实就是改变了自己的状态为candidate,并且调用RoleChangeHandler这个钩子函数,RoleChangeHandler其实是提供给客户端的一个钩子,客户端可以实现它来做角色变更后的一些后置处理。其实就是根据leader发送过来的心跳包做逻辑判断,如果自己没有leader,便更新自己的leader为心跳包中的leader。改变自己的角色为leader。

2024-06-25 20:37:34 649 2

原创 深度解析RocketMq源码-高可用存储组件(二)Dledger框架概览

本文主要讲的是Dledger框架的大概组成部分,已经每个组件的使用,后面会详细介绍Dledger的投票和日志同步流程。

2024-06-24 23:30:25 1314 2

原创 深度解析RocketMq源码-高可用存储组件(一) raft协议详解

term是一个单调递增的数字,每次candidate在发起选举的时候,便会将当前的term增加1。并且raft协议规定在每个term中,只能有一次选举。

2024-06-23 18:26:30 904 5

原创 深度解析RocketMq源码-高可用存储组件(一) raft协议详解

所以在leader宕机过后,一定能够保证整个集群超过一半的节点拥有最新的日志,再结合投票时一定是半数以上的支持,才能当选leader,也即他的索引一定是大于等于集群半数以上节点的,所以一定有用最新的日志。前面的文章已经分析过,以前rocketmq通过主从复制的思想实现系统的高可用,即在搭建集群的时候会手动的设置一个主节点和从节点,在写入数据的时候,会先写入到主broker,然后再同步到从节点中。term是一个单调递增的数字,每次candidate在发起选举的时候,便会将当前的term增加1。

2024-06-23 18:22:13 1171 1

原创 深度解析RocketMq源码-持久化组件(四) CommitLog

至此,rocketmq的核心持久化主键commitLog我们便已经全部分析完成,简单而言,commitLog持有一个messageFileQueue,而mappedFileQueue对应不同的mappedFile文件,而mappedFile通过mmap技术与磁盘中的文件建立映射。

2024-06-20 21:40:00 951 1

原创 深度解析RocketMq源码-持久化组件(三) 刷盘策略

同步刷盘主要是在发送刷盘请求过后,会同步等待刷盘结果,这是它不会丢数据的根本原因。异步刷盘有两种模式定时模式和实时模式。实时模式就是数据写入后立刻刷盘,但是调用线程并不会阻塞等待刷盘结果;定时模式就是会启动一个线程每过500ms写入数据,这样做可以增大一次刷盘的条数,减少磁盘IO。

2024-06-18 00:13:08 1469 1

原创 深度解析RocketMq源码-持久化组件(二) MappedFileQueue

在获取到最后一块mappedfile的时候,可以根据needcreate参数判断:如果超过内存范围,是否需要重新构建一个mappedfile。//重要,根据起始偏移量获取到最后一块mappedfile,并且根据needcreate参数判断如果超过内存范围,是否需要重新构建一个mappedfile//获取到mappedfilequeue中的最后一个mappedfile//如果最后一块mappedfile为空,表示此时为初始化,获取到新的mapperfile的起始位置。

2024-06-16 19:06:29 678 1

原创 深度解析RocketMq源码-持久化组件(一) MappedFile

mappedFile本质上是利用mapp技术来提高读写效率的,而mappedFile的核心本质上就是mappedFileBuffer,默认大小为1G,可以由mappedFileSizeCommitLog来进行控制。

2024-06-15 12:25:58 1307 4

原创 RocketMq生产常见问题及解决方案(三) 顺序消息和消息堆积的解决法方式

而在订单业务常见的一个场景是,每个订单有下单->支付->发货这已操作,需要通过mq同步给第三方,我们在同步的时候需要保证每个单据内这三个操作是有序的就行,这就是局部有序消息。订阅关系不一致导致消息堆积,在rocketmq中,同一个消费者组,应该订阅的topic和tag信息应该是一模一样的,即消费者组在rocketmq中是作为一个基本单位存在的。我么有一次发生的问题就是,有一个灰度和非灰度环境,在配置的时候,灰度环境和非灰度环境都属于一个消费者组,但是消费的topic不一样,导致消费者不能消费。

2024-06-06 21:32:40 367 4

原创 RocketMq生产常见问题及解决方案(二) 重复消费产生原因以及解决方式

保证消息不被重复消费的主要解决方案主要是保证消费者端的幂等性。主要解决思路是更加messageId作为未Id,保证它的唯一性。所以我们可以用redis或者mysql的唯一索引来存储messageId,当消费的时候根据messageId查询一下redis或者mysql,如果查到有数据,表示已经被重复消费。在插入数据的时候我们也可以采用分布式锁防止并发插入问题。

2024-06-06 01:28:22 2457 2

原创 RocketMq生产常见问题及解决方案(一) 如何保证消息不丢失

4.如果commit或者rollback消息发送失败,此时业务流程已经执行成功,mq会启动一个定时任务检查未被消费的half消息,并且回调业务方,判断这个half消息是应该回滚还是提交。答案是否定的,以保证消费者一定消费为例,当消息者一直没有消费成功的时候,rocketmq的消费者会进行重试,当超过16次过后,会加入到死信队列,这个时候,我们可以启动一个定时任务去扫描死信队列的内容,做对应的逻辑处理。将推送到mq消息和本地事务放到同一个事务中,并且如果失败,便多次重试,如果多次重试未果,便回滚事务。

2024-06-06 01:03:14 900 1

原创 深度解析RocketMq源码-Namesrv

前面几篇文章已经介绍了rocketmq的架构,如何使用以及生产上问题如何解决。接下来几篇文章将会介绍rocketmq的源码,我们在看问题的时候,会带着我们的问题去代码找答案,同时在代码中学习一些常见的代码技巧。接下来,我们先来探究一下NameSrv的源码。1.NameSrv之间是相互通信的吗?从上面源码分析,可以看出namesrv之间是没有通信的。2.NameSrv是如何存储topic的路由信息的?

2024-05-27 22:48:24 1290 3

原创 深度解析RocketMq源码-远程通信组件

rocketmq的各个组件之间的通信都是用rocketmq-remoting这个组件实现,而这个组件底层采用的是netty来进行通信的,所以学习这个组件我们可以学到netty的使用。在介绍这个组件之前,我们来了解一下什么是netty。NettyRemotingAbstract的主要作用是接收Netty的请求,根据请求找到一个响应或者请求的processor,然后调用对应的客户端实现的processor来处理结果。/***///oneway请求的信号量,通过它来控制同时发送oneway请求的并发数。

2024-05-24 00:36:46 1105 2

原创 RocketMQ的使用

rocketmq对于使用者来说,我们只需要关心如何推送各种不同类型的消息,以及如何消费各种类型的消息即可。

2024-04-17 22:48:15 1496 3

空空如也

空空如也

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

TA关注的人

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