自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库

Apache Doris是一个基于MPP架构的易于使用,高性能和实时的分析数据库,以其极高的速度和易用性而闻名。海量数据下返回查询结果仅需亚秒级响应时间,不仅可以支持高并发点查询场景,还可以支持高通量复杂分析场景。这些都使得 Apache Doris 成为报表分析、即席查询、统一数据仓库和数据湖查询加速等场景的理想工具。在 Apache Doris 上,用户可以构建各种应用,如用户行为分析、AB 测试平台、日志检索分析、用户画像分析、订单分析等。2023年亚洲多丽丝峰会即将到来,热烈邀请您加入!

2023-11-03 09:39:57 1360

原创 10亿数据如何快速插入MySQL?

但如果是HDD的话,虽然顺序读写会有非常高的表现,但HDD无法应对并发写入,例如每个库10张表,假设10张表在并发写入,每张表虽然是顺序写入,由于多个表的存储位置不同,HDD只有1个磁头,不支持并发写,只能重新寻道,耗时将大大增加,失去顺序读写的高性能。回到SSD的场景,不同SSD厂商的写入能力不同,对于并发写入的能力也不同,有的支持500M/s,有的支持1G/s读写,有的支持8个并发,有的支持4个并发。通过以上配置,灵活调整线上数据库的数量,以及写表并发度,无论是HDD还是SSD,我们系统都能支持。

2023-11-01 23:19:44 166

原创 程序员一辈子到底能挣多少钱?

总体的薪水在:45w+40w+60w+240w+350w约700w 到 75w+80w+100w+480w+600w=1300w;总体的薪水在:120w+80w+320w+900w=1420w 到 150w+110w+480w+1800w=2540w;总体的薪水在:24w+25w+90w+200w约350w 到 45w+40w+140w+350w约580w;总体的薪水在:18w+24w+90w+150w约280w 到 36w+40w+140w+250w约480w;毕业二线大厂,准大厂,年薪15w-25w;

2023-10-30 23:22:40 178

原创 从Mysql架构看一条查询sql的执行过程

查询优化器的目的就是根据解析树生成不同的执行计划(ExecutionPlan),然后选择一种最优的执行计划,MySQL里面使用的是基于开销(cost)的优化器,那种执行计划开销最小,就用哪种。一条SQL语句是可以有很多种执行方式的,最终返回相同的结果,他们是等价的。所以我们的表在存储数据的同时,还要组织数据的存储结构,这个存储结构就是由我们的存储引擎决定的,所以我们也可以把存储引擎叫做表类型。是我们用得最多的两个存储引擎,在MySQL5.5版本之前,默认的存储引擎是MyISAM,它是MySQL自带的。

2023-10-28 22:30:55 684

原创 字节码操作的手术刀-Javassist

在 Javassist 中每个需要编辑的 class 都对应一个 CtClass,CtClass 的含义是编译时的类("compile time class"),这些类会存储在 ClassPool 中,ClassPool 是一个容器,存储了一系列 CtClass 对象。变量表示所有参数的数组,它是一个 Object 类型的数组,如果参数中有原始类型,会被转为对应的对象类型,比如上面 foo(int a, int b) 对应的。细心的读者看到这里会有疑问,如果是方法异常退出,它的方法返回值是什么呢?

2023-08-27 21:22:59 182

原创 教你用 Java 字节码做点有趣的事 ——无痛破解 Java 系软件

这篇文章,我们讲解了如何通过 javaagent 和 ASM 的方式来破解软件,回顾一下重点:要通过反编译工具找到相关的 license 检查函数在哪里,然后通过 javaagent 的 premain 函数在类加载之前动态修改字节码,绕过 license 检查机制。反编译后的源码可以看到,这里判断 license 是否过期的方法比较简单,是拿当前时间与过期时间做对比,如果当前时间大于过期时间,就返回 license 已过期。" 逻辑,代码如下所示。语句对应的字节码语句如下所示。改写后的字节码如下所示。

2023-08-24 23:12:10 144

原创 10个必备的IntelliJ IDEA插件,提高开发效率

只需按 “ctrl+;安装链接:https://plugins.jetbrains.com/plugin/14515-code-issue-manager-document--fix-issues-in-your-codebase。WakaTime 是一个能够根据你的编程活动,自动生成各种数据的工具,可以让你看到在编码过程中的指标、见解和时间跟踪,从而评估你的编码效率。你可以准确地知道编码所花费的时间,因为此插件会自动记录你输入的起止时间以及各种细节,如项目、文件、分支、提交/PR、功能等。

2023-08-23 21:09:08 214

原创 字节码调教的入口 —— JVM 的寄生插件 javaagent 那些事

MySQL 同样提供了域套接字进行访问的方式。它的 addTransformer 给 Instrumentation 注册一个 transformer,transformer 是 ClassFileTransformer 接口的实例,这个接口就只有一个 transform 方法,调用 addTransformer 设置 transformer 以后,后续JVM 加载所有类之前都会被这个 transform 方法拦截,这个方法接收原类文件的字节数组,返回转换过的字节数组,在这个方法中可以做任意的类文件改写。

2023-08-22 22:57:20 696

原创 docker安装clickhouse

创建clickhouse目录。启动临时容器, 生成配置文件。拷贝配置文件到1中的目录。

2023-08-22 00:06:16 555

原创 代码未动,监控先行 —— APM 分布式链路监控简介

如果有这两个 header的情况下,会把 header 中的 traceId 当做后续调用的 traceId,header 中的 spanId 做为当前调用的 parentId。因此数据一定要合并上报,减少网络的开销。参考 Google Dapper 论文实现,每个请求都生成全局唯一的 Trace ID/Span ID,端到端透传到上下游所有的节点,通过 Trace ID 将不同系统的孤立的调用日志和异常日志串联在一起,同时通过 Span ID、ParentId 表达节点的父子关系,如下图所示。

2023-08-21 23:56:14 122

原创 字节码的终极应用-GitHub高星开源APM项目之Pinpoint

本文我们介绍了一个开源的APM分布式链路监控工具Pinpoint.主要介绍了Pinpoint的架构和特点, 随后我们使用几个简单的demo模拟分布式调用的场景, 和大家一起分析了java应用采集到的各种监控指标, 主要分为Metric(指标数据)和Trace(请求数据). 希望对大家排查问题有一定的帮助.方法燃尽图是从方法的维度看某一次请求的耗时情况, 从该图中我们可以清洗的看到调用了哪些方法, 他们的耗时是多少. 对于业务开发人员来说, 通常可以一眼就看出哪些方法的耗时偏高.

2023-08-14 22:40:31 64 1

原创 字节码角度看synchronized和反射的实现原理

如果是实例方法,JVM 会尝试获取实例对象的锁,如果是类方法,JVM 会尝试获取类锁。这篇文章主要从字节码角度看了Java中的synchronized和射调用底层的原理,当然还有一些其他比较有意思的语法比如lambda, switch等, 感兴趣的小伙伴也可以从字节码角度去了解一下, 相信你会有很多不一样的收获.从输出的堆栈可以看到 MethodAccessor 的实现类是委托类DelegatingMethodAccessorImpl,它的 invoke 函数非常简单,就是把调用委托给了真正的实现类。

2023-08-14 22:39:59 42

原创 JPA Buddy插件,让你的数据库操作快人一步!

JPA Buddy是一个广泛使用的IntelliJ IDEA插件,面向使用JPA数据模型和相关技术(如Spring DataJPA,DB版本控制工具(Flyway,Liquibase),MapStruct等)的新手和有经验的开发人员。该插件的好处是它不仅支持JPA,还支持数据访问层开发中使用的相关库:Spring Data JPA,MapStruct,Lombok和DB版本控制解决方案。数据通常比代码更长久,因此当我们在现有数据库上构建 JPA 数据层时,我们需要基于当前表创建 JPA 实体。

2023-08-04 00:07:07 137

原创 SpringBoot中使用Mybatis-Plus和Phoenix连接HBase

测试springboot项目启动是否ok, 如果还不行则删除zk中的hbase目录和hbase的缓存(前提条件 安装好了HBase, 并能够使用Phoenix连接到HBase.重启hbase,进入hbase shell, 执行下面4步。我这里使用了druid连接池,ORM框架使用的是。直接在Phoenix的目录中执行sql脚本创建表。使用Phoenix的py脚本运行sql文件。4. springboot中创建对应的类。, 可以帮我们省去一些写sql的时间.1.导入maven依赖。创建init.sql。

2023-08-02 23:36:57 247

原创 Phoenix连接单机版Hbase,亲测可用

将Phoenix lib目录下的phoenix-server-hbase-2.3-5.1.3.jar复制到HBase的lib目录。网上找了好多phoenix连接hbase的教程, 但是尝试了一下都失败了. 本文记录一我亲测成功的步骤。修改HBase的hbase-site.xml, 将zk的ip修改成hostname。将HBase的hbase-stie.xml配置拷贝到phoenix/bin目录下。修改HBase的hbase-site.xml配置文件, 假如下面的内容。测试Phoenix连接HBase。

2023-08-02 09:56:19 138

原创 ElasticSearch系列-集群安装(docker compose方式)

当你创建一个索引的时候,你可以指定你想要的分片的数量。一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。允许集群初始化 master 节点节点数: cluster.initial_master_nodes: ["node-1", "node-2","node-3"]这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

2023-07-29 10:40:04 466

原创 Linux安装Hbase2.3.5单机版本,并配置远程访问

hbase本身自带的有zookeeper,但是如果要远程访问, 需要配置使用外部的zookeeper。复制zookeeper的配置zoo.cfg到hbase的conf目录下。修改Hbase hbase-env.sh配置。1.上传并解压hbase2.3.5安装包。修改hbase-site.xml配置。3.配置Hbase的环境变量 (2.配置Java安装路径。安装zookeeper。

2023-07-28 15:47:34 142

原创 设计模式系列-软件设计七大原则(一)

这样的设计, 可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并能够降低修改程序所造成的风险。但是,我们在实际开发中会项目依赖,组合,聚合这些关系,还有还有项目的规模,周期,技术人员的水平,对进度的把控,很多类都不符合单一职责。我们这时候再看来代码,Tom 的兴趣无论怎么暴涨,对于新的课程,我只需要新建一个类,通过传参的方式告诉 Tom,而不需要修改底层代码。早来早走,晚来晚走。

2023-07-27 23:35:53 41

原创 ElasticSearch系列-SpringBoot整合

聚合有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。映射: 用来决定放入文档的每个字段以什么样方式录入到 ES 中 字段类型 分词器..文档: 可以被索引最小单元 json 数据格式。特点: 始终使用面向对象方式操作 ES。索引: 用来存放相似文档集合。基于 id 查询文档。

2023-07-25 23:39:57 127

原创 ElasticSearch系列-分词器

大小写转换(例将“Quick”转为小写),去掉停用词(例如停用词像“a”、“and”、“the”等等),加入同义词(例如同义词像“jump”和“leap”)。我是中国人 this is good man----> analyzer----> 我 是 中 国 人 this is good man。三者顺序: Character Filters--->Tokenizer--->Token Filter。英文分词可以根据空格将单词分开,中文分词比较复杂,可以采用机器学习算法来分词。

2023-07-24 20:39:12 244

原创 ElasticSearch系列-索引原理与数据写入读取流程

每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个mit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。就是在你执行mit操作之前,数据要么是停留在buffer中,要么是停留在os cache中,无论是buffer还是os cache都是内存,一旦这台机器死了,内存中的数据就全丢了。

2023-07-21 23:02:57 130 1

原创 无处不在的字节码技术-ASM在cglib和fastjson中的应用

可以看到 cglib 生成了一个 Person 的子类,实现了 doJob 方法,此方法会调用 MethodInterceptor 的 intercept 函数,这个函数先输出 ">>>>>before intercept" 然后调用父类(也即真正的 Person 类)的 doJob 的方法,最后输出。第一,cglib 使用 ASM 生成了目标代理类的一个子类,在子类中扩展父类方法,达到代理的功能,因此要求代理的类不能是 final 的。假定不考虑嵌套,特殊字符的情况,不做语法解析的情况下,可以这么来写。

2023-07-20 23:24:16 192

原创 ElasticSearch系列-高级查询

NOTE1: 通过使用term查询得知ES中默认使用分词器为。: 值为数组类型,用来根据一组id获取多个对应的文档。默认字段分词查询[query_string]: 是一个数组,在数组中用来指定展示那些字段。NOTE2: 通过使用term查询得知,: 用来检索含有指定前缀的关键词的相关文档。: 可以让符合条件的文档中的关键词高亮。: 用来模糊查询含有指定关键字的文档。多字段查询[multi_match]: 指定查询结果中返回指定条数。: 用来指定查询指定范围内的文档。: 用来组合多个条件实现复杂查询。

2023-07-18 23:07:54 364

原创 JVM专栏-类加载的时机

加载、验证、准备、初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始(注意是“开始”,而不是“进行”或“完成”),而解析阶段则不一定:它在某些情况下可以在初始化后再开始,这是为了支持 Java 语言的运行时绑定。当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,当真正用到父接口的时候才会初始化。初始化一个类时,如果其父类还没有初始化,则需要先初始化父类。,除此之外,其它所有引用类的方式都不会触发初始化,称为。

2023-07-16 23:39:36 104 1

原创 JVM专栏-类文件结构

一个类可能实现了多个接口,因此用接口索引集合来描述。name_index 是一个索引值,它指向常量池中一个 CONSTANT_Utf8_info 类型常量,此常量代表这个类(或接口)的全限定名,这里 name_index 值若为 0x0002,也即是指向了常量池中的第二项常量。类索引和父类索引用两个 u2 类型的索引值表示,它们各自指向一个类型为 CONSTANT_Class_info 的类描述符常量,通过该常量总的索引值可以找到定义在 CONSTANT_Utf8_info 类型的常量中的全限定名字符串。

2023-07-16 23:30:56 37 1

原创 JVM专栏-内存分配与回收策略

JVM 规范中运行时数据区域中的方法区,在 HotSpot 虚拟机中也称为永久代(Permanet Generation),存放一些类信息、常量、静态变量等数据,当系统要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,会触发 Full GC。值是否设置为允许担保失败, 如果是,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小, 如果大于,将尝试进行一次 Minor GC,尽管这次 Minor GC 是有风险的;, 如果这个条件成立,Minor GC 可以确保是安全的;

2023-07-16 23:28:59 52 1

原创 JVM专栏-垃圾回收器

追求高吞吐量,可以通过减少 GC 执行实际工作的时间,然而,仅仅偶尔运行 GC 意味着每当 GC 运行时将有许多工作要做,因为在此期间积累在堆中的对象数量很高。Serial Old 收集器是 Serial 的老年代版本,都是单线程收集器,只启用一条 GC 线程,都适合客户端应用。CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。

2023-07-15 23:21:13 63 1

原创 JVM专栏-垃圾回收策略与算法

引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法。如果对象被判定为有必要执行 finalize() 方法,那么对象会被放入一个 F-Queue 队列中,虚拟机会以较低的优先级执行这些 finalize()方法,但不会确保所有的 finalize() 方法都会执行结束。比如,一个字符串 "bingo" 进入了常量池,但是当前系统没有任何一个 String 对象引用常量池中的 "bingo" 常量,也没有其它地方引用这个字面量,必要的话,"bingo"常量会被清理出常量池。

2023-07-15 23:05:11 102 1

原创 ElasticSearch系列-基础用法

说明: ES中支持字段类型非常丰富,如:text、keyword、integer、long、ip 等。更多参见https://www.elastic.co/guide/en/elasticsearch/reference/7.15/mapping-types.html。说明:批量时不会因为一个失败而全部失败,而是继续执行后续操作,在返回时按照执行的状态返回!说明: 这种更新方式是先删除原始文档,在将更新文档以新的内容插入。说明: 这种方式可以将数据原始内容保存,并在此基础上更新。布尔类型:boolean。

2023-07-12 11:57:34 47 1

原创 IBM WebSphere MQ8.0 发送和接收消息

代码地址: https://gitee.com/sharloon/ibm-mq80-demo.git。本文使用springboot集成IBM MQ的客户端, 简单的实现消息接收和发送逻辑.这里的配置和上文中创建的队列信息一致。

2023-07-12 11:16:33 295 1

原创 HotSpot 虚拟机对象探秘

所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配的。也就是说在建立一个对象时两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。访问对象时,首先需要通过引用类型的变量找到该对象的句柄,然后根据句柄中对象的地址找到对象。对象所需内存的大小在类加载完成后便可完全确定,接下来从堆中划分一块对应大小的内存空间给新的对象。分配完内存后,为对象中的成员变量赋上初始值,设置对象头信息,调用对象的构造函数方法进行初始化。

2023-07-10 00:21:18 54 1

原创 基于Redis的消息发布和订阅(广播模式)

但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。优点是反序列化时不需要提供类型信息(class),但缺点是需要实现Serializable接口,还有序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。如下如所示, 定义了2个Linstener, 模拟2个应用监听同一个通道. 根据发送和接收的数据类型我们可以选择合适的数据序列化和反序列化方式, 默认序列化方式为。创建Listener2类, 模拟另外一个程序。

2023-07-10 00:20:40 393 1

原创 ElasticSearch系列-核心概念

单个字段数据拆分成多个独立的词(分词).只有text类型的字段才会分词, keyworkd, int, long, date等不分词.类似于mysql的一行数据. ES中的文档采用了轻量级的JSON格式数据来表示。并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。数据存储的逻辑空间, 一个索引可以创建多个分片, 分片可以均匀的分布在ES集群上.数据实际存储的空间, 一个分片可以有多个分段, 多个小的分段可以合并成一个大分段。在默认配置下,ES可以根据插入的数据。

2023-07-10 00:19:15 65 1

原创 ElasticSearch系列-简介与安装

的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的。目前国内大厂几乎无一不用Elasticsearch,阿里,腾讯,京东,美团 等等 .....,但是lucene的API相对复杂,需要深厚的搜索理论。很难集成到实际的应用中去。索: 建立索引 文本---->切分 ---> 词 文章出现过 出现多少次。检索: 查询 关键词---> 索引中--> 符合条件文章 相关度排序。,类似于通过字典的检索字表查字的过程。

2023-07-10 00:18:33 68 1

原创 字节码初体验-从HelloWorld开始

不学习底层知识可能不会阻碍你成为一个称职的程序员,但也许会阻碍你成为一个优秀的程序员。我所理解的底层知识,是指编程或开发所依赖的平台(或者框架、工具)的知识。对于 Java 开发者来说,虚拟机、字节码就是其底层知识。这篇文章我们以输出 “Hello, World” 来开始字节码之旅,如果之前没有怎么接触过字节码的话,这篇文章应该能够让你对字节码有一个最基本的认识。

2023-07-02 00:19:24 59 1

原创 字节码原理浅析 —— 基于栈的执行引擎

字节码是运行在 JVM 上的,为了能弄懂字节码,需要对 JVM 的运行原理有所了解。这篇文章将以栈帧为切入点理解字节码在 JVM 上执行的细节。

2023-07-02 00:17:40 66 1

原创 基于Redis的消息发布和订阅(广播模式)

如下如所示, 定义了2个Linstener, 模拟2个应用监听同一个通道. 根据发送和接收的数据类型我们可以选择合适的数据序列化和反序列化方式, 默认序列化方式为。. 对于普通的Bean来说使用。

2023-06-28 09:29:17 365 1

原创 IBM WebSphere MQ8.0 安装与队列创建

最近接触的项目中使用了IBM WebsphereMQ 8.x, 由于要为其编写监控插件, 所以在网上找了很久的资料, 发现8.x实在是太老了, 很多资源和教程都没有,遂决定在此统一整理和记录一下.注:安装完成后,相关文件会被自动安装在/opt/mqm下,也会为你创建一个mqm的用户。至此安装完毕, 上面的操作使用root账号操作.下面的创建队列使用mqm账号.创建一个简单的本地队列这里取名叫做QUEUE1。创建过程有点复杂, 疯狂吐槽!进入队列管理器(创建队列和通道)查看目前已创建的队列。

2023-06-14 16:02:27 861

原创 都 2023 年了,你还在用 Kafka?快试试这个全新平台吧

BookKeeper是一个可横向扩展的、错误容忍的、低延迟的分布式存储服务,BookKeeper中最基本的单位是记录,实际上就一个字节数组,而记录的数组称之为ledger,BK会将记录复制到多个bookies,存储ledger的节点叫做bookies,从而获得更高的可用性和错误容忍性。发布订阅系统中最核心的概念是topic,简单来说,topic可以理解为一个管道,producer可以往这个管道丢消息,consumer可以从这个管道的另一端读取消息,但是这里可以有多个consumer同时从这个管道读取消息。

2023-06-08 09:02:08 94

原创 让小白也能看懂,ChatGPT入门级科普“十问十答”

ChatGPT 可以作为搜索引擎的补充,帮助用户快速回答一些询问,但是不能代替搜索引擎对大量信息和网页的搜索和筛选功能。ChatGPT 可以回答一些询问,但是它并不具备搜索网络上的大量信息和网页的能力。训练数据和背景:ChatGPT相比小爱同学、小度、Siri等智能助手的训练量要大的多,所以能够回答的问题范围要比后者宽很多。ChatGPT的优势在于对搜索答案的整合,而搜索引擎的海量数据是其优势。而且如果想要ChatGPT取代搜索引擎,则需要时刻保持数据的更新,这对ChatGPT来说是一笔无法想象的开销。

2023-06-05 19:04:59 163 1

空空如也

空空如也

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

TA关注的人

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