- 博客(52)
- 收藏
- 关注
原创 JDK体系结构
Java JVM参数设置与内存管理摘要:JDK体系通过JVM实现跨平台特性,其内存模型包括堆、栈、元空间等核心区域。SpringBoot应用可通过-Xms、-Xmx等参数配置堆内存大小,元空间建议设置-XX:MetaspaceSize和-XX:MaxMetaspaceSize相同值(如256M)。线程栈大小-Xss影响单线程栈深度与总线程数,较小值会减少栈帧数量但增加可创建线程数。合理配置内存参数可优化应用性能,避免频繁FullGC。特别注意元空间与永久代的参数区别,调整元空间会触发昂贵的FullGC操作。
2025-05-28 10:42:41
384
原创 JVM-双亲委派机制
双亲委派机制是JVM类加载的重要原则,它通过层级委托保证核心类库的安全性和类的唯一性。该机制要求类加载器在加载类时先委托父加载器处理,父加载器无法完成时才自行加载。这种设计既能防止核心API被篡改(如自定义的java.lang.String类不会被加载),又能避免类的重复加载。 然而,某些场景需要打破这一机制。例如Tomcat为支持多应用隔离和热部署,实现了自定义类加载体系:WebappClassLoader直接加载应用类而不委托父加载器,实现不同版本类库共存;JasperLoader专用于JSP文件,支持
2025-05-27 09:29:35
839
原创 JVM类加载机制
Java类加载运行全过程解析:当通过java命令运行主类时,JVM会依次执行加载、验证、准备、解析和初始化等步骤。类加载器采用双亲委派机制,包括引导类加载器、扩展类加载器和应用类加载器。其中引导类加载器负责核心类库,扩展类加载器处理ext目录,应用类加载器加载用户自定义类。类是按需动态加载的,只有在使用时才会被加载到JVM中。整个过程还包括静态变量分配、方法符号引用解析等操作,最终生成Class对象作为访问入口。
2025-05-27 09:20:45
1041
原创 JUC入门(五)
简单理解:预先创建,要用就拿池化”(Pooling)是一种资源管理技术,用于优化资源的使用效率,减少资源创建和销毁的开销。池化技术的核心思想是预先创建并维护一组资源对象(如线程、数据库连接、对象实例等),当需要使用这些资源时,从池中获取一个可用的资源,使用完毕后将其归还到池中,而不是每次都重新创建和销毁资源。这里讲述池化技术之一>线程池减少线程创建和销毁的开销:线程的创建和销毁是相对耗时的操作,线程池通过复用线程,避免了频繁的线程创建和销毁,从而提高了程序的性能。提高线程的可管理性。
2025-05-22 17:49:46
770
原创 Kafka设计原理详解
在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。
2025-05-20 14:43:20
803
原创 kafka入门(一)
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。
2025-05-20 09:51:25
747
原创 JUC入门(四)
本文介绍了 `ReentrantReadWriteLock` 和 `BlockingQueue` 的原理与使用。`ReentrantReadWriteLock` 是一种读写锁,允许多个读线程共享访问,写线程独占访问,通过 AQS 实现,适用于读多写少的场景。`BlockingQueue` 是一种线程安全的队列,支持阻塞操作,如 `put()` 和 `take()`,适用于生产者-消费者模型。其常见实现包括 `ArrayBlockingQueue` 和 `SynchronousQueue`。`
2025-05-19 21:47:58
1212
原创 JUC入门(三)
juc的Callable简单使用,三个常用辅助类CountDownLatch、CyclicBarrier、Semaphore的简单代码展示和原理分析
2025-05-19 18:12:15
771
原创 Zookeeper典型使用场景
Zookeeper分布式锁的实现主要依赖于其临时顺序节点特性,以避免并发竞争和羊群效应。在并发严重的情况下,传统的加锁方式会导致性能下降,因为所有连接都在监听同一个节点,导致大量并发竞争。通过使用临时顺序节点,可以实现公平锁,所有加锁请求按顺序排队,从而缓解服务端压力。此外,Zookeeper还支持读写锁,确保在读取数据时不允许写入,避免数据不一致。在分布式服务架构中,Zookeeper作为注册中心,服务实例在启动时注册自己的信息到Zookeeper节点,其他服务可以通过监听这些节点来获取服务信息,实现服务
2025-05-18 20:57:26
517
原创 Zookeeper分布式一致性协议
ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议,ZAB是Paxos算法的一种简化实现。ZAB 协议定义:ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 协议。下面我们会重点讲这两个东西。
2025-05-18 20:56:54
464
原创 Zookeeper 集群模式
Zookeeper集群模式包含三种角色:Leader、Follower和Observer。Leader处理所有事务请求,Follower处理读请求并参与Leader选举,Observer仅处理读请求且不参与选举。本文详细介绍了在单台机器上搭建Zookeeper伪集群的步骤,包括配置Java环境、下载解压Zookeeper、修改配置文件、启动实例及检测集群状态。此外,还介绍了Zookeeper 3.5.0版本引入的集群动态配置特性,允许在不停止服务的情况下进行集群扩容或缩容,但需开启超级管理员身份验证模式以确
2025-05-18 20:36:10
948
原创 Zookeeper入门(三)
本文介绍了如何使用Java客户端与Zookeeper服务端进行交互。首先,通过Maven引入Zookeeper依赖,确保客户端与服务端版本一致以避免兼容性问题。接着,详细说明了如何创建Zookeeper客户端实例,包括设置连接地址、会话超时时间以及Watcher事件处理器。文章还介绍了多种Zookeeper构造方法,并解释了相关参数的作用,如会话ID、会话秘钥和只读模式等。此外,提供了同步和异步创建节点、修改节点数据的示例代码。最后,简要介绍了Curator,一个由Netflix开源的Zookeeper客户
2025-05-18 20:23:00
1075
原创 Zookeeper 入门(二)
Zookeeper 的ACL 权限控制,可以控制节点的读写操作,保证数据的安全性,Zookeeper ACL 权限设置分为 3 部分组成,分别是:权限模式(Scheme)、授权对象(ID)、权限信息最终组成一条例如“scheme:id:permission”格式的 ACL 请求信息。下面我们具体看一下这 3 部分代表什么意思:Scheme(权限模式):用来设置 ZooKeeper 服务器进行权限验证的方式。ZooKeeper 的权限验证方式大体分为两种类型:一种是范围验证。
2025-05-18 20:16:28
1493
原创 Zookeeper入门(一)
Zookeeper是一个分布式协调框架,主要用于解决分布式系统中的数据管理问题,如统一命名服务、状态同步、集群管理等。其核心概念包括文件系统数据结构和监听通知机制。Zookeeper维护一个类似文件系统的数据结构,其中每个子目录项称为znode,有持久化、临时、顺序编号等类型。客户端可以注册监听节点或目录的变化,一旦触发事件,监听即被移除。Zookeeper广泛应用于分布式配置中心、注册中心、锁、队列、集群选举等场景。安装Zookeeper需要配置Java环境,下载并解压Zookeeper,重命名配置文件后
2025-05-18 20:08:06
747
原创 JUC入门(二)
文章主要讨论了Java中的锁机制和集合类的线程安全问题。首先,通过“5、8锁现象”解释了synchronized锁的使用场景和原理,强调任何对象都可以作为锁,锁的作用是确保线程同步执行。接着,通过多个代码示例展示了不同情况下锁的行为,如静态方法锁类、普通方法锁对象等。随后,文章探讨了集合类的线程安全问题,指出ArrayList在多线程环境下可能抛出ConcurrentModificationException异常,并提供了解决方案,如使用Vector、Collections.synchronizedList
2025-05-18 18:46:39
1121
原创 JUC入门(一)
JUC是Java并发工具包,包含处理多线程和并发编程的类。进程是程序的执行实例,线程是进程中的执行单元。Java中默认有主线程和GC线程。Java通过Thread、Runnable和Callable实现多线程,但线程的创建和启动依赖于底层的C++实现。并发和并行分别强调任务在同一时间段内的交替执行和同时执行。线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。wait和sleep的区别在于锁的释放和异常处理。Lock锁提供了比synch
2025-05-18 13:39:26
829
原创 MongoDB分片集群
分片是将数据水平拆分到不同服务器上的技术,用于解决单机数据量和并发量瓶颈问题。MongoDB分片集群由路由节点(mongos)、配置节点和数据节点组成。路由节点提供单一入口,转发请求并合并结果;配置节点存储集群元数据;数据节点以复制集形式扩展,最多支持1024个分片。分片键可以是单个或复合字段,支持范围分片和哈希分片。数据段分裂和集群平衡由后台平衡器自动管理。搭建分片集群需创建数据目录、日志文件,并启动多个mongod实例,配置复制集和路由节点。分片表需显式启用,动态扩容可通过添加新复制集实现。
2025-05-16 10:29:39
1147
原创 MongoDB 应用实战
本文介绍了如何在Java项目中通过Maven引入MongoDB驱动,并展示了原生Java客户端和Spring Boot整合MongoDB的示例代码。在原生Java客户端中,通过MongoClients.create()方法连接MongoDB,并进行数据库操作,如插入、查询和更新文档。在Spring Boot项目中,通过配置类AppConfig定义MongoClient和MongoTemplate,并使用MongoTemplate进行数据库操作。测试类ApplicationRunnerTest展示了如何使用M
2025-05-16 10:17:38
394
原创 MongoDB 高可用复制集架构
MongoDB复制集是一种实现高可用性的机制,类似于Redis的哨兵模式。它通过在主节点(Primary)写入数据时自动复制到从节点(Secondary),并在主节点故障时自动选举新主节点来确保服务的连续性。复制集不仅支持数据分发和读写分离,还能实现异地容灾。典型的复制集由至少三个具有投票权的节点组成,包括一个主节点和多个从节点。数据复制通过oplog(操作日志)实现,从节点通过回放oplog保持与主节点的数据一致。故障恢复基于RAFT一致性算法,确保在大多数节点存活的情况下进行选举。复制集的搭建涉及配置多
2025-05-15 10:49:56
1060
原创 MongoDB进阶
MongoDB聚合框架是一个强大的工具,用于对集合中的数据进行复杂计算和转换。通过聚合操作,可以对数据进行分组、排序、筛选等操作,并将结果转化为期望的形式。例如,可以通过$addFields添加新字段,或通过$sort对数据进行排序。聚合管道优化是提升性能的关键,如通过投影优化减少数据量,或通过合并$match和$sort阶段减少排序对象数量。此外,索引在MongoDB中扮演着重要角色,支持更快的查询和排序。单键索引、复合索引和多键索引各有其适用场景,索引的创建和优化可以显著提升查询效率。通过合理使用聚合操
2025-05-15 10:41:34
891
原创 MongoDB入门
MongoDB是一款非关系型数据库,以其“海量数据库”的特性著称,适用于处理大规模数据。与关系型数据库不同,MongoDB不使用SQL语句,数据模型灵活,支持文档、数组等复杂数据结构。MongoDB的安装和配置相对简单,支持多种操作系统,且提供了丰富的客户端工具和API接口。核心操作包括数据的插入、查询、更新和删除,支持条件查询、嵌套查询、数组操作等高级功能。MongoDB的文档模型与内存中的对象模型一致,易于理解和使用。此外,MongoDB支持分布式部署,具有良好的扩展性和高可用性,是NoSQL数据库中的
2025-05-14 16:42:22
1376
1
原创 ElasticSearch高级功能
本文介绍了Elasticsearch中的三种高级搜索功能:搜索模板(Search Template)、建议搜索(Suggest Search)和地理位置搜索(GeoPoint)。搜索模板允许用户将常用搜索请求模板化,通过传递参数实现快速调用,支持多种参数传递方式如toJson、join和默认值。建议搜索功能类似于搜索引擎的自动完成,通过特殊数据结构实现高效的前缀搜索提示。地理位置搜索则支持在指定区域内搜索数据、搜索附近地点数据以及进行地理位置聚合分析,需使用geo_point类型的字段。这些功能极大地增强了
2025-05-14 11:22:04
496
原创 ElasticSearch父子关系数据建模
在Elasticsearch中,嵌套对象和父子文档是两种常见的数据建模方式。嵌套对象将多个数据存储在一起,虽然读取性能高,但更新时需要重新索引整个对象,维护成本较高。相比之下,父子文档通过Join数据类型实现,父文档和子文档是独立的,更新父文档不会影响子文档,反之亦然。父子文档必须存在于同一个分片中,查询时无需跨分片,性能较高。此外,文章还介绍了如何在Elasticsearch中实现父子关系的映射、索引和查询,并对比了嵌套对象和父子文档的优缺点。最后,文章以GitHub的代码搜索为例,展示了如何通过定义特殊
2025-05-13 14:50:30
953
原创 ElasticSearch之数据建模
在设计用户文档数据类型时,采用包含地址数据数组的方式虽然增加了灵活性,但在搜索时可能导致不准确的结果。例如,搜索“省份为北京,城市为天津”的用户时,可能会返回不相关的数据。为了解决这个问题,可以使用nested对象类型来定义地址数组。nested对象在存储时不会进行扁平化处理,确保每个地址对象的独立性,从而在搜索时能够精确匹配。尽管nested对象的搜索语法较为复杂,但它能有效避免数据读写错误,是推荐的设计方式。通过使用nested对象,可以确保搜索结果准确无误,提升数据管理的效率和可靠性。
2025-05-13 03:00:00
203
原创 es生产集群部署之针对生产集群的脑裂问题专门定制的重要参数
如果我们有三个master候选节点,还有100个数据节点,那么quorum就是3 / 2 + 1 = 2。(1)如果master是单独的那个节点,另外2个节点是master候选节点,那么此时那个单独。如果我们有2个节点,都可以是master候选节点,那么quorum是2 / 2 + 1 = 2。综上所述,一个生产环境的es集群,至少要有3个节点,同时将这个参数设置为quorum,也。比如我们有10个节点,都能维护数据,也可以是master候选节点,那么quorum就是10 / 2。
2025-05-13 02:00:00
886
原创 ElasticSearch聚合操作案例
本文介绍了在Elasticsearch中使用聚合(aggs)进行数据分析的多种方法。首先,通过terms聚合进行简单的分组统计,类似于SQL中的count,并可根据_count或_key进行排序。其次,展示了如何在分组基础上进行更复杂的聚合统计,如计算不同颜色车辆的平均价格,并根据平均值排序。接着,介绍了下钻分析,即先按颜色分组,再按品牌分组,并计算平均价格。此外,还提到了使用histogram和date_histogram进行区间统计,分别用于数值区间和日期区间的分组分析。最后,探讨了如何在聚合中使用fi
2025-05-12 21:21:07
1168
1
原创 分词器工作流程和Ik分词器详解
文章主要介绍了文本分词器的功能及其在搜索引擎中的应用。分词器通过字符过滤、分词和词元过滤等步骤,将文本拆分为单词并进行标准化处理(如时态转换、单复数转换),以提高搜索结果的召回率。文章详细说明了内置分词器(如standard、simple、whitespace、stop analyzer)的使用方法,并介绍了如何定制分词器,包括启用停用词过滤、自定义字符过滤和词元过滤等。此外,文章还探讨了IK分词器的配置和自定义词库的更新方法,以及如何在搜索结果中实现高亮显示,并介绍了不同高亮显示技术的性能和应用场景。
2025-05-12 21:09:57
606
原创 ElasticSearch文档分值_score计算底层原理
ElasticSearch的文档分值(_score)计算基于布尔模型和相关性评分算法。首先,布尔模型通过用户的查询条件过滤出包含指定术语的文档,使用must、must not、should等条件进行筛选,以减少后续计算的文档数量,提升性能。接着,相关性评分算法(TF/IDF)计算文档与搜索文本的匹配程度。TF(Term Frequency)衡量搜索词在文档中出现的频率,频率越高,相关性越强;IDF(Inverse Document Frequency)衡量搜索词在整个索引中的普遍性,出现次数越多,相关性越弱
2025-05-12 21:07:21
112
原创 Elasticsearch架构原理
Elasticsearch是一个分布式搜索引擎,其核心功能包括节点管理、分片和副本机制、文档写入与检索原理、准实时索引实现以及搜索结果的精准度控制。Elasticsearch集群由Master节点和DataNode节点组成,Master节点负责集群管理,而DataNode节点处理数据写入和检索。分片机制将索引数据分布在不同的服务器上,副本机制则确保数据的容错性。文档写入时,数据首先写入内存,随后刷新到文件系统缓存,并通过translog日志保障数据安全。检索过程中,协调节点汇总各分片的查询结果并进行全局排序
2025-05-12 14:20:49
2225
1
原创 ElasticSearch进阶
本文介绍了Elasticsearch中的文档批量操作和DSL语言高级查询。文档批量操作包括通过_mget API批量获取文档数据,以及通过_bulk API进行批量创建、替换、删除和修改文档。DSL语言高级查询部分涵盖了无查询条件、叶子条件查询(如模糊匹配和精确匹配)、组合条件查询、连接查询以及查询与过滤的区别。此外,还介绍了文档映射(动态映射和静态映射)、核心数据类型、keyword与text映射类型的区别、对已存在映射的修改方法、乐观并发控制以及ES集群环境的搭建步骤。这些内容为使用Elasticsea
2025-05-11 15:53:45
1536
1
原创 ElasticSearch入门详解
Elasticsearch(ES)是一个基于Java的开源企业级搜索引擎,支持实时搜索,具有稳定、可靠、快速的特点,且安装使用方便。它解决了Lucene框架的诸多限制,如只能在Java项目中使用、配置复杂、不支持集群环境等问题。ES广泛应用于京东、携程、滴滴等公司。其核心概念包括索引、映射、字段、文档、集群、节点、分片和副本等。安装ES时需创建普通用户,并配置系统参数以解决资源限制问题。ES数据管理支持对文档的索引、搜索、排序和过滤,使用JSON作为文档序列化格式。基本操作包括创建、查询、删除索引,以及添加
2025-05-11 15:27:24
1747
2
原创 SpringBoot整合Rabbitmq:超详细(包括docker配置Rabbitmq的详细过程)
MQ(message queue),从字面意思上看就个 FIFO 先入先出的队列,只不过队列中存放的内容是 message 而已,它是一种具有接收数据、存储数据、发送数据等功能的技术服务。在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务,用于上下游传递消息。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务常见的MQ消息中间件有很多,例如ActiveMQRabbitMQKafkaRocketMQ等等。
2025-04-17 17:44:03
2597
1
原创 测试过程模型和流程
软件开发及测试人员(有时包括用户)全面的参与到测试工作中。测试人员要对测试的全过程进行全程的跟踪。对软件所有的产品进行全面的测试。测试活动应该是循环往复的、不断。表示软件测试是一个独立的流程。测试人员要充分关注开发过程。测试人员早期参与软件项目。尽早开展测试执行工作。
2025-04-10 10:14:32
235
原创 python基础(转义字符,变量)
python仅保存一份相同且不可变的字符串,不同的值被放在字符串的驻留池中,python的驻留机制对相同的字符串只保留拷贝一份,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量。如果想转义符也原封不动的输出,可以在转义符前面加一个r,例如:str = r"jack\naaa",就会原封不动的输出。用三个单引号'''内容''',或者三个双引号"""内容"""可以保证内容原封不动的输出,包括缩进,空格,特殊符号等。我们所说的“类型”是变量所指的内存数据的类型,而不是说变量本身有类型。
2025-04-09 22:07:41
580
原创 软件测试的定义和目的
出发点:使自己确信产品是能够正常工作的评价一个程序和系统的特性或能力,并确定他是否达到期望的结果,软件测试就是以此为目的的任何行为。出发点:测试是为了发现错误而执行一个程序或者系统的过程测试是为了证明程序有错,而不是证明程序无错误一个好的测试用例在于它能发现以前未发现的错误一个成功的测试是发现了以前未发现的错误的测试在规定的条件下运行系统或构件的过程:观察和记录结果,并对系统或构件的某些方面给出评价分析软件项目的过程:检测现有状况和所需状况之间的不同,并评估软件项目的特性。
2025-04-09 16:33:23
370
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人