自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

胖墩的IT博客

有空时就写写遇到的问题

  • 博客(325)
  • 收藏
  • 关注

原创 Elasticsearch 查询命令执行时,如何通过词项索引、词项字典、倒排表定位文档逻辑介绍

这里不涉及到源码,只是根据网上的一些文章总结一下,目前不需要细究,只需要知道大概就好,除非你的工作是二次开发ES。

2023-12-27 01:04:52 1352

原创 Elasticsearch 8.9 search命令执行查询源码

一、相关的API的handler1、接收HTTP请求的handler2、往数据节点发送查询请求的action(TransportSearchAction)3、通过transportService把查询请求发送到指定的数据节点二、数据节点收到请求的处理逻辑1、尝试从缓存中加载查询结果2、不通过缓存查询,直接执行查询(1)executeQuery和executeRank两种查询方式(2)、根据搜索上下文,在查询之前添加各种查询搜集器(3) 执行查询操作(遍历此索引在此数据节点所有的分片)这里只是HTTP发

2023-12-16 21:06:28 370

原创 Elasticsearch 8.9 refresh刷Es缓冲区的数据到Lucene,更新segemnt,使数据可见

下面是lucene源码中关于这两个API的实现,//这个是会尝试获取刷新锁,如果没有则不执行刷新操作try {//这里会等待获取刷新锁,所以会阻塞try {但是实际上最后执行刷新还是执行的方法。

2023-12-10 00:22:54 438

原创 Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码

ES 把内存中segment和translog刷进磁盘

2023-12-07 00:58:44 619

原创 Elasticsearch 8.9 Bulk批量给索引增加数据源码

下面的图来自,这篇文章主要讲的是客户端发送bulk命令到保存到Lucene和translog的过程源码,不涉及到把数据刷到磁盘的逻辑,也不讲解存储在Lucene的数据结构。

2023-11-16 23:53:06 556

原创 Elasticsearch 8.9 服务端接收创建索引和查询索引信息源码

至于下面创建索引和查询索引信息的入口如何找到的,可以。

2023-11-07 00:58:21 459

原创 Elasticsearch 8.9 Master节点处理请求源码

大家看可以看这个图非常好,下午的讲解代码在各个类和方法之间流转,都体现这个图上。

2023-10-22 03:03:25 512

原创 Elasticsearch 8.9启动时构建接收Rest请求的hander过程源码

/省略代码。。。这里只选几个经常用到的//省略代码/*** 用于获取索引和头索引 API 的 REST 处理程序。*///代表路由匹配规则,通过这个规则知道要调用这个实例,每一个实例路由规则都是不一样的@[email protected]()

2023-10-21 02:08:18 810

原创 kafka 3.5 生产者请求中的acks,在服务端如何处理源码

这意味着至少要等待leader已经成功将数据写入本地log,但是并没有等待所有follower是否成功写入。如果follower没有成功备份数据,而此时leader又无法提供服务,则消息会丢失。已经成功接收数据,同时重试配置不会发生作用(因为客户端不知道是否失败)回馈的offset会总是设置为。acks=-1,太慢,acks=0,有风险,acks=1,则是推荐,所以也是默认值的原因。这里不从头开始,如果想知道推送的数据怎么到下面方法的,可以看。不需要等待任何确认收到的信息,副本将立即加到。

2023-09-15 01:30:39 394

原创 kafka 3.5 主题分区的高水位线HW,低水位线LW,logStartOffset,LogEndOffset什么情况下会更新源码

这里需要针对和做特殊说明,要不会让大家脑袋混乱,并且前言后的章节讲的都是主题分区级别的。

2023-09-13 01:07:39 410

原创 kafka 3.5 主题分区ISR伸缩源码

*** 仅包括已提交到 ZK 的同步副本。*此集可能包括扩展后未提交的 ISR 成员。此“有效”ISR 用于推进高水位线以及确定 acks=all produce 请求需要哪些副本* 指示我们是否有正在进行的 更改分区 请求。原因以方法更新的是maximalIsr变量,而不是ISR列表本身。maximalIsr是一个优化变量,用于表示在上一次调用方法时,ISR列表的最大长度。这样,Kafka可以通过检查当前ISR列表的长度与maximalIsr的大小来判断是否需要进行收缩操作。更新。

2023-09-09 23:35:26 510

原创 kafka 3.5 主题分区的Follower创建Fetcher线程从Leader拉取数据源码

Kakfa集群有主题,每一个主题下又有很多分区,为了保证防止丢失数据,在分区下分Leader副本和Follower副本,而kafka的某个分区的Leader和Follower数据如何同步呢?下面就是讲解的这个首先要知道,Follower的数据是通过Fetch线程异步从Leader拉取的数据,不懂的可以看一下。

2023-09-06 23:29:03 512 2

原创 kakfa 3.5 kafka服务端处理消费者客户端拉取数据请求源码

选合适副本默认首先Leader副本,但是2.4版本后支持主题分区非Leader副本中读取数据,即Follower副本读取数据。在遍历日志的时候不需要将日志全部读到内存中,而是在需要的时候再读取。我们直接看最重要的iterator方法。kafka服务端接收生产者数据的API在KafkaApis.scala类中,handleFetchRequest方法。这里生成一个新的文件数据对象,下面就是。()方法,之后调用第五章节的。最后通过这个方法获得日志。方法在内存中生成批量数据。之后看一下哪里调用的。

2023-09-03 16:38:01 1103

原创 kafka 3.5 kafka服务端接收生产者发送的数据源码

方法中比遍历Topic分区集合,针对Topic分区得到分区对象,再执行保存数据到Topic分区Leader。把数据存入副本中(这里的副本指的是Topic分区Leader副本)kafka服务端接收生产者数据的API在。获取需要写入到哪个segment。上面写入本地日志的方法是。

2023-09-02 20:24:11 848

原创 Jedis 4.4.3 JedisCluster通过key获得哈希槽,再通过哈希槽得到节点的连接的源码

了解完redis服务端,就有一个疑问,如果redis是集群模式,客户端通过什么方式知道我要请求哪个节点呢?下面就通过源码解析一下。

2023-08-08 00:42:17 295

原创 Redis 6.5 服务端开启多线程源码

redis支持开启多线程,只有从socket到读取缓冲区和从输出缓冲区到socket这两段过程是多线程,而命令的执行还是单线程,并且是由主线程执行。

2023-08-06 03:35:15 735

原创 Redis 6.5 服务端的读取缓冲区和输出缓冲区执行源码

. . . . . . //删除影响理解的代码行 //开始进入循环,在个方法里会一直while触发eventLoop aeMain(server . el);//删除所有的EventLoop:只有上面aeMain方法结束才执行这个 aeDeleteEventLoop(server . el);return 0;while(!} }

2023-08-03 01:09:05 281

原创 kafka 2.1.1 java的消费者客户端如何获取数据源码

后,this.nextInLineRecords.isFetched会被置为true,下次循环又要走else了,nextInLineRecords又重新被队列中的新的值赋值,并且新的this.nextInLineRecords.isFetched=false,下一次循环又可以走if语句了。2、之后第二次走的是循环里的if语句,因为刚被赋值,所以nextInLineRecords不为null,并且还没有提取,所以this.nextInLineRecords.isFetched=false。

2023-07-21 01:20:53 448

原创 kakfa 2.4.1 java的生产者client发送消息源码

/.......删除干扰理解的代码行 RecordAccumulator . RecordAppendResult var13;try {//.......删除干扰理解的代码行 RecordAccumulator . RecordAppendResult appendResult = this . tryAppend(timestamp , key , value , headers , callback , dq);

2023-07-20 01:08:17 298

原创 kakfa 2.4.1 java的生产者client在发送消息前分配消息属于哪个分区源码

标题是否不是很熟悉,面试不得必问啊。

2023-07-18 00:38:17 596

原创 Redis 6.5 RDB和AOF持久化源码

RDB和AOF持久化源码介绍

2023-07-17 01:08:27 169

原创 SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue三种队列的简单介绍

其实不光只有这三种,只是因为java提供的四种线程池用到了这三种队列,所以这里探究一下这三种队列的区别,如果看其他的队列,可以直接看java.util.Queue这个接口谁继承了,自己去研究去文章目录0、BlockingQueue1、SynchronousQueue2、LinkedBlockingQueue3、DelayedWorkQueue0、BlockingQueue为什么先介绍这个呢?后面的SynchronousQueue、LinkedBlockingQueue、DelayedWorkQ.

2022-08-14 16:00:33 373 1

原创 java提供的四种线程池和自定义创建线程池

newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor、newSingleThreadExecutor区别

2022-05-05 00:36:41 1016

原创 HTTP和HTTPS简单介绍(TCP三次握手四次挥手和TLS 2或4 次握手)

HTTP/TCP三次握手和四次挥手图解,HTTPS中根据不同的TLS版本有两次握手,也有四次握手的,并且绝大多数情况都是都是先进行TCP三次握手,再进行TLS的握手

2022-05-03 21:01:32 2720

原创 ThreadLocal简单介绍

Java中的ThreadLocal详解,大家可以看一下这个,我下面的讲的不如他,我这只是让自己理解的深入些,做一下笔记1、简介先看一张图,出现的场景:每一个线程都可能产生一个全局变量,并且值都是专属于这一个线程的,别的线程不能使用,供线程调用后面的方法取出使用,避免重复传参数,当然你说我就专门当方法参数传,那也可以不用如果涉及到不安全的工具类的使用,可能会造成问题,比如simpleDateFormat。所以需要单独给每一个线程配置本地变量,2、先看一个代码示例,这里只是做范例,这.

2022-04-18 00:34:49 445

原创 给一组数,可以重复组合,组成一个比n刚好小的数字

面试给的这个算法题,也不知道LeetCode上有没有这个题,反正当时没写出来,有点事后诸葛亮的感觉,下面是解题代码逻辑,当然测试用例少,不保证对,如果有不对的希望大家指出来,或者我没想到的情况,后续慢慢修改题目:给你一个n和一个数字的数组,比如n=23121,数组A={2,4,9},当然保证数组A中都是个位数,并且没有重复的,没说数组A有序,我这默认有序,结果得到一个数22999,就是数组A拼出来的一个刚好比n小的数。代码: public static void main(String[] ar.

2022-04-02 00:41:20 1864 11

原创 raft和ZooKeeper选举的不同

kraft 算法参考Raft协议原理详解我这就摘抄一些当个笔记首先从kafka2.8开始,kraft就出现替代ZooKeeper的,但是实际上还不建议生产使用。但是要了解一下kraft和ZooKeeper的区别,慢慢以后缺少的补充1、选举的区别(1)kraft角色有三种:leader、candidate、follower,只有选举时才会出现candidate,当没leader时,所有的follower都是candidate,如果有leader后,其他的都是follower每一个candida.

2022-03-23 01:47:48 2173

原创 kafka 零拷贝如何实现的(FileChannel)

想了解kafka的零拷贝到底是什么,可以看一下Kafka为什么这么快?如果看零拷贝和非拷贝之间的区别图可以看Kafka_Kafka中的Zero Copy

2022-03-20 21:17:26 2658 1

原创 kafka 3.5 日志定时清理(源码)

文章目录1、定时任务入口2、LopManager(这个是日志抽象层,实际逻辑不在这里)(1) 把日志清理加入定时任务中3、清理符合条件的日志(1)deletableSegments(把需要删除的segment加入待删除的集合)(2) deleteSegments(对待删除的segment集合删除)1、定时任务入口这里选择kraft的模式启动的定时任务,所以入口是在BrokerServer.scala文件中,如果选择ZooKeeper模式的入口在KafkaServer.scala def star

2022-03-20 15:25:26 2684 1

原创 kakfa 3.5 创建topic流程(源码)

1、主要是因为从kafka2.8开始,除了zk我们又有新的选择,用kraft来做zk的工作,并被称为革命性的,但是旧的zk其实没有被废弃,只是提供了新的选择,并且创建topic的命令,Kraft是用控制器API创建的。在命令行上添加的配置会覆盖服务器的默认设置,例如数据应该保留的时间长度。下面就是验证参数,是否指定参数设置等等,之后调用新创建的clien创建topic。因为我觉得先看这个比较好理解,因为它不是单调执行的一步到位,比如先看。这个方法是实际调用的call的方法。初始化时,会根据配置文件中的。

2022-03-17 00:59:56 3945 3

原创 kafka 3.5 如何选择启用kraft还是ZooKeeper(选择哪个server实现,不涉及到server具体的初始化)

这里用kakfa 3.5版本做源码演示。

2022-03-15 01:04:40 2058

原创 Redist 6.2 zset的写入(源码),最后介绍一下skiplist的结构

文章目录1、zaddGenericCommand(入口函数)2、zsetAdd(真正执行添加操作的函数)3、zslInsert(执行skiplist插入新节点的操作)4、skiplist结构图说明1、zaddGenericCommand(入口函数)首先命令server.c文件夹下的 {"zadd",zaddCommand,-4, "write use-memory fast @sortedset", 0,NULL,1,1,1,0,0,0},而下面是服务器内部执行的逻辑/*

2022-03-11 01:46:17 314

原创 redis 中ziplist和hashtable数据结构

hash存储在redis底层存储空间结构有两种,分别是ziplist和hashtable,这俩的先后顺序是先创建ziplist,当ziplist中的某个value大于设置的阈值或者整个ziplist的长度大于某个阈值,则ziplist会转换成hashtable,ziplist数据结构图hashtable数据结构图这样做的原因如果你学过java,那就应该知道hashmap在JDK1.8及之后时,使用的是数组+链表+红黑树的数据结构,它转换的条件:当阈值是默认阈值0.75,链表的深度大于等于.

2022-03-09 01:05:59 1207

原创 Redis 6.2 执行hset 操作(源码)

文章目录hset 主函数1,首先创建hash对象(hashTypeLookupWriteOrCreate)2、尝试转换存储空间的编码格式(hashTypeTryConversion)3、遍历把键值对根据存储空间格式(ziplist,hashtable)的不同分别 存储起来hset 主函数void hsetCommand(client *c) { int i, created = 0; robj *o; if ((c->argc % 2) == 1) { .

2022-03-09 00:30:39 473

原创 Redis 6.2 redis创建一个字符串对象是如何选择合适的编码方式(源码)

通过Redis 6.2 key的创建SDS(源码)知道String在redis中是有多种编码方式存储的,但是对一段字符串如何进行选择编码方式就不清楚了,下面就是redis在保存数据时,字符串编码方式如何选择的源码文章目录当键值对的value是字符串时,入口方法选择String类型的编码方式createRawStringObject(OBJ_ENCODING_RAW 编码方式)createEmbeddedStringObject(OBJ_ENCODING_EMBSTR 编码方式)当键值对的value是.

2022-02-14 00:17:35 969

原创 Redis 6.2 故障转移(源码)

推荐渐进式解析 Redis 源码 - 哨兵 sentinel 上面比较全面,我这也是参考上面的。文章目录sentinelFailoverStateMachine(故障转移的主流程)sentinelFailoverWaitStart(第一步故障转移开始)sentinelFailoverSelectSlave(第二步,选择晋升的服务器节点函数)sentinelSelectSlave(选举一个sentinel来主导故障转移的)sentinelFailoverSendSlaveOfNoOne(第三步发送 sl.

2022-02-14 00:09:27 508

原创 Redis 6.2 sentinel判断主观下线和客观下线(源码)

推荐渐进式解析 Redis 源码 - 哨兵 sentinel 上面有讲解的主观下线和客观下线文章目录前言sentinelCheckSubjectivelyDown(主观下线)sentinelCheckObjectivelyDown(客观下线)前言下面是我摘抄的有关主观下线和客观下线的介绍:主观下线 SDOWN: 如果 监控的服务器节点 在 down-after-milliseconds设置的毫秒时效内没有响应检测,则会被判定为 主观下线;这个状态适用所有服务器节点客观下线 ODOWN.

2022-02-13 23:06:42 1291

原创 Redis 6.2 哨兵定时检查源码

推荐看渐进式解析 Redis 源码 - 哨兵 sentinel他写的很全,我这也是参考他的,顺着他的逻辑来的文章目录serverCron(定时任务触发方法)sentinelTimer(哨兵模式定时器检查)sentinelCheckTiltCondition(检查是否需要进入TITL模式)sentinelHandleDictOfRedisInstances(对传过来的某一种哨兵实例进行循环执行周期函数)sentinelHandleRedisInstance (周期性调用函数)sentinelReconn.

2022-02-13 22:33:39 570

原创 Redis 6.2 哨兵模式服务端初始化(源码)

推荐看渐进式解析 Redis 源码 - 哨兵 sentinel 我也是参考这篇文章,他的是旧版,但是变化不大,下面是我复制过来的图片,仅供参考文章目录main(启动方法)initSentinelConfig(初始化是哨兵的端口)initSentinel(初始化哨兵模式中的常量)sentinelHandleConfiguration(创建一个哨兵节点需要的初始化)createSentinelRedisInstance(创建哨兵节点)sentinelIsRunning(启动哨兵模式)main(启动方法.

2022-02-13 21:49:38 446

原创 Redis 6.2当发送set String时,redis是如何处理的(源码)

下面主要是源码,标题也都是各个方法,所以不建议跳着看,而是从头开始看会,文章目录setCommandtryObjectEncoding(尝试对字符串对象进行编码以节省空间)setGenericCommand(set 字符串实际的执行流程)genericSetKey(核心set指令的操作)lookupKeyWrite(先尝试判断key是否过期,过期则删除)lookupKey(查找key)dbAdd(正常添加键值对)dbOverwrite(覆盖旧的value,但是不修改过期时间)setCommand.

2022-02-13 18:40:35 558

空空如也

空空如也

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

TA关注的人

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