自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

博学谷狂野架构师的博客

助力Java工程师,持续学习,进阶架构师。

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

原创 他皮任他皮,我学我的习-我的Java进阶之路!!

重点是在架构师修炼路径,接下来逐一讲解。

2023-11-03 14:30:39 281

原创 6000+字讲透ElasticSearch 索引设计

我们创建索引就像创建表结构一样,必须非常慎重的,索引如果创建不好后面会出现各种各样的问题在创建索引时,可以预先定义字段的类型(映射类型)及相关属性数据库建表的时候,我们DDL依据一般都会指定每个字段的存储类型,例如:varchar、int、datetime等,目的很明确,就是更精确的存储数据,防止数据类型格式混乱,在Elasticsearch中也是这样,创建索引的时候一般也需要指定索引的字段类型,这种方式称为映射(Mapping)

2023-05-11 13:46:32 956 1

原创 【9种】ElasticSearch分词器详解,一文get!!!| 博学谷狂野架构师

分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。在 ES 中,Analysis 是通过分词器(Analyzer)来实现的,可使用 ES 内置的分析器或者按需定制化分析器。举一个分词简单的例子:比如你输入,会自动帮你分成两个单词,一个是mastering,另一个是,可以看出单词也被转化成了小写的。当内置的分词器无法满足需求时,可以创建custom类型的分词器。

2023-05-08 16:23:34 8143 1

原创 【9种】ElasticSearch分词器详解,一文get!!!| 博学谷狂野架构师

分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。在 ES 中,Analysis 是通过分词器(Analyzer)来实现的,可使用 ES 内置的分析器或者按需定制化分析器。举一个分词简单的例子:比如你输入,会自动帮你分成两个单词,一个是mastering,另一个是,可以看出单词也被转化成了小写的。当内置的分词器无法满足需求时,可以创建custom类型的分词器。

2023-05-08 16:22:50 6428

原创 MySQL用的在溜,不知道业务如何设计也白搭!!!

当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF。不能完全按照范式得要求进行设计,考虑以后如何使用表值CHAR(4)占用空间。

2023-04-27 14:51:49 474

原创 一次说透,4大服务性幂等场景架构设计方案!

以上图为例,当客户端要生成订单时,可以基于token机制保证生成订单的幂等性,接着订单生成成功后,还会基于feign调用库存服务进行库存扣减,此时则很有可能出现,库存服务执行扣减库存成功,但是当结果返回时,出现网络抖动超时了,那么上游的订单服务则很有可能会发起重试,此时如果不进行扣减库存的幂等性保证的话,则出现扣减库存执行多次。即可,将id设置为唯一索引,也是最容易想到的方式,一旦id出现重复,就会出现异常,避免了脏数据的发生也可以解决永久性幂等。当模拟一万并发时,最终的库存数量是错误的。

2023-04-25 14:36:21 525

原创 一文搞定接口幂等性架构设计方案

现如今很多系统都会基于分布式或微服务思想完成对系统的架构设计。那么在这一个系统中,就会存在若干个微服务,而且服务间也会产生相互通信调用。那么既然产生了服务调用,就必然会存在服务调用延迟或失败的问题。当出现这种问题,服务端会进行重试等操作或客户端有可能会进行多次点击提交。如果这样请求多次的话,那最终处理的数据结果就一定要保证统一,如支付场景。此时就需要通过保证业务幂等性方案来完成。幂等是一个数学与计算机学概念,即f(n) = 1^n。

2023-04-20 14:26:11 524

原创 一个Java线程的线生(线生 vs 人生)

下面我们看下Java的多线程博学谷狂野架构师GitHub地址(有我精心准备的130本电子书PDF)只分享干货、不吹水,让我们一起加油!😄。

2023-04-18 15:27:49 408

原创 Java并发工具合集JUC大爆发!!!

CyclicBarrier,是JDK1.5的java.util.concurrent(JUC)并发包中提供的一个并发工具类C yclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集,当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置,如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。parties。

2023-04-17 15:39:32 275

原创 RocketMQ是是如何管理消费进度的?又是如何保证消息成功消费的?

消息确认机制在实际使用RocketMQ的时候我们并不能保证每次发送的消息都刚好能被消费者一次性正常消费成功,可能会存在需要多次消费才能成功或者一直消费失败的情况,那作为发送者该做如何处理呢?为了保证数据不被丢失,RocketMQ支持消息确认机制,即ack。发送者为了保证消息肯定消费成功,只有使用方明确表示消费成功,RocketMQ才会认为消息消费成功。中途断电,抛出异常等都不会认为成功——即都会重新投递。

2023-04-13 14:14:34 2009

原创 小心,丢失的消息!RocketMQ投递策略帮你解决问题!博学谷狂野架构师

RocketMQ的消息投递分分为两种:一种是生产者往MQ Broker中投递;另外一种则是MQ broker 往消费者投递(这种投递的说法是从消息传递的角度阐述的,实际上底层是消费者从MQ broker 中Pull拉取的)。本文将从模型的角度来阐述这两种机制。

2023-04-12 14:24:31 522

原创 索引优化、优化,你又是一个好MongoDB!!!博学谷狂野架构师

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录。本质上目录是将书中一小部分内容信息(比如题目)和内容的位置信息(页码)共同构成,而由于信息量小(只有题目),所以我们可以很快找到我们想要的信息片段,再根据页码找到相应的内容。同样索引也是只保留某个域的一部分信息(建立了索引的field的信息),以及对应的文档的位置信息。

2023-04-11 14:37:03 644

原创 索引优化、优化,你又是一个好MongoDB!!!博学谷狂野架构师

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录。本质上目录是将书中一小部分内容信息(比如题目)和内容的位置信息(页码)共同构成,而由于信息量小(只有题目),所以我们可以很快找到我们想要的信息片段,再根据页码找到相应的内容。同样索引也是只保留某个域的一部分信息(建立了索引的field的信息),以及对应的文档的位置信息。

2023-04-11 14:31:54 664

原创 ElasticSearch还能性能调优,涨见识、涨见识了!!!

性能优化是个涉及面非常广的问题,不同的环境,不同的业务场景可能会存在不同的优化方案,本文只对一些相关的知识点做简单的总结,具体方案可以根据场景自行尝试。一般情况,如果ID字段不会被用作Range 类型搜索字段,都可以定义成keyword类型,这是因为keyword会被优化,以便进行terms查询,Integers等数字类的mapping类型,会被优化来进行range类型搜索,将integers改成keyword类型之后,搜索性能大约能提升30%。您的支持是我坚持写作最大的动力。博学谷狂野架构师。

2023-03-29 15:31:39 839

原创 【必须收藏】别再乱找TiDB 集群部署教程了,这篇保姆级教程来帮你!!| 博学谷狂野架构师

从 TiDB 4.0 版本开始,TiUP 作为新的工具,承担着包管理器的角色,管理着 TiDB 生态下众多的组件,如 TiDB、PD、TiKV 等。用户想要运行 TiDB 生态中任何组件时,只需要执行 TiUP 一行命令即可,相比以前,极大地降低了管理难度。

2023-03-27 16:29:44 760

原创 【建议收藏】7000+字的TIDB保姆级简介,你见过吗

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。TiDB是PingCAP。

2023-03-24 14:34:59 657

原创 【建议收藏】7000+字的TIDB保姆级简介,你见过吗

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。TiDB是PingCAP。

2023-03-24 14:32:58 335

原创 你可能不那么知道的Tomcat生命周期管理 | 博学谷狂野架构师

Lifecycle接口统一管理Tomcat生命周期。定义13个string类型常量,用于LifecycleEvent时间的type属性中,用于区分组件发出的LifecycleEvent事件时的状态。定义三个管理监听器的方法,addLifecycleListener、findLifecycleListeners、removeLifecycleListener。定义4个生命周期的方法,init、start、stop、destory,用于执行生命周期的各个阶段的操作。

2023-03-22 15:29:26 438

原创 为什么Tomcat架构要这么设计?这篇文章告诉你答案!

对于I/0选择,要根据业务场景来定,一般高并发场景下,APR和NIO2的性能要优于NIO和BIO,(linux操作系统支持的NIO2由于是一个假的,并没有真正实现AIO,所以一般linux上推荐使用NIO,如果是APR的话,需要安装APR库,而Windows上默认安装了),所以在8.5的版本中默认是NIO。如果找到,则执行该类,获得请求的回应,并返回。bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。

2023-03-21 15:40:14 197

原创 性能优化搞得好,Tomcat少不了。| 博学谷狂野架构师

其实并没有标准定义,一般认为Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,是开发和调试JSP程序的首选,实现了对Servlet和JavaServer Page的支持,并提供Web服务器的一些特有功能。Tomcat是一款开源轻量级Web应用服务器,是一款优秀的Servlet容器实现。

2023-03-16 15:15:00 467

原创 性能优化搞得好,Tomcat少不了。| 博学谷狂野架构师

其实并没有标准定义,一般认为Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,是开发和调试JSP程序的首选,实现了对Servlet和JavaServer Page的支持,并提供Web服务器的一些特有功能。Tomcat是一款开源轻量级Web应用服务器,是一款优秀的Servlet容器实现。

2023-03-16 15:13:25 269

原创 这是一篇纯讲SQL语句优化的文章!!!| 博学谷狂野架构师

insert如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。insert into tb_test values(1,'tom');insert into tb_test values(2,'cat');insert into tb_test values(3,'jerry');.....优化方案一:批量插入数据Insert into tb_test values(1,'Tom'),(2,&

2023-03-15 14:16:24 234

原创 卷起来!!!看了这篇文章我才知道MySQL事务&MVCC到底是啥?

当我们创建了上面的这张表,我们在查看表结构的时候,就可以显式的看到这三个字段。隐藏字段含义DB_TRX_ID最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。DB_ROW_ID隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。而上述的前两个字段是肯定会添加的, 是否添加最后一个字段DB_ROW_ID,得看当前表有没有主键,如果有主键,则不会添加该隐藏字段。

2023-03-14 15:43:41 214

原创 如何搞定MySQL锁(全局锁、表级锁、行级锁)?这篇文章告诉你答案!太TMD详细了!!!

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源()的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。全局锁:锁定数据库中的所有表。表级锁:每次操作锁住整张表。行级锁:每次操作锁住对应的行数据。

2023-03-08 14:15:29 653

原创 为什么99%的程序员都做不好SQL优化?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bnfMYmvN-1678170715437)(http://image.openwrite.cn/29993_97C6018427A44E9F92FE3BB8A7296568)]大家可能没有听说过存储引擎,但是一定听过引擎这个词,引擎就是发动机,是一个机器的核心组件。比如,对于舰载机、直升机、火箭来说,他们都有各自的引擎,是他们最为核心的组件。

2023-03-07 14:36:44 477

原创 【建议收藏】超详细的Canal入门,看这篇就够了!!!

canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。

2023-03-06 15:19:34 1373 4

原创 从菜鸟程序员到高级架构师,竟然是因为这个字final

final关键字,实际的含义就一句话,不可改变。什么是不可改变?就是初始化完成之后就不能再做任何的修改,修饰成员变量的时候,成员变量变成一个常数;修饰方法的时候,方法不允许被重写;修饰类的时候,类不允许被继承;修饰参数列表的时候,入参的对象也是不可以改变。这个就是不可变,无论是引用新的对象,重写还是继承,都是改变的方法,而final就是把这个变更的路给堵死。

2023-03-02 11:15:38 315

原创 为什么95%的Java程序员人,都是用不好Synchronized?

自旋锁在JDK 1.4.2中引入,默认关闭,但是可以使用-XX:+UseSpinning开开启,在JDK1.6中默认开启。同时自旋的默认次数为10次,可以通过参数-XX:PreBlockSpin来调整;如果通过参数-XX:preBlockSpin来调整自旋锁的自旋次数,会带来诸多不便。假如我将参数调整为10,但是系统很多线程都是等你刚刚退出的时候就释放了锁(假如你多自旋一两次就可以获取锁),你是不是很尴尬。

2023-03-01 16:12:18 330 1

原创 99% 的 Java 程序员者,都败给这一个字Synchronized!

在方法执行期间,执行线程持有了monitor,其他任何线程都无法再获得同一个monitor。如果一个同步方法执行期间抛出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的monitor将在异常抛到同步方法之外时自动释放。

2023-02-28 13:44:32 430

原创 8000+字,就说一个字Volatile

简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。 Java volatile关键字用于将Java变量标记为“存储在主存储器中”。更确切地说,这意味着,每次读取一个volatile变量

2023-02-24 14:37:00 356

原创 98%的程序员,都没有研究过JVM重排序和顺序一致性

文章整理自。

2023-02-22 15:05:27 268

原创 来一波骚操作,Java内存模型

文章整理自 博学谷狂野架构师什么是JMM并发编程领域的关键问题线程之间的通信 线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。​ 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在java中典型的消息传递方式就是wait()和notify()。线

2023-02-21 15:24:48 285

原创 时隔多年,这次我终于把动态代理的源码翻了个地儿朝天

本文内容整理自 博学谷狂野架构师动态代理简介​ Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。用户可以更加结构图,自己编码完成Proxy模式。这种实现称为静态代理。​ Java提供了java.lang.reflect.Proxy类与InvocationHandler接口,配合反射,可以实现动态代理。静态代理的代理类与代理操作,都是事先编码,运行过程种无法修改代理

2023-02-15 14:02:22 433

原创 这些JDK8 新特性,我还是第一次听说

什么是函数式接口?简单来说就是只有一个抽象函数的接口。为了使得函数式接口的定义更加规范,java8 提供了@FunctionalInterface 注解告诉编译器在编译器去检查函数式接口的合法性,以便在编译器在编译出错时给出提示。有且仅有一个抽象函数必须要有@FunctionalInterface 注解可以有默认方法/*** thread.*

2023-02-14 14:05:51 271

原创 为什么这11道JVM面试题这么重要(附答案)

本文内容整理自 博学谷狂野架构师运行时数据区都包含什么虚拟机的基础面试题程序计数器Java 虚拟机栈本地方法栈Java 堆方法区程序计数器程序计数器是线程私有的,并且是JVM中唯一不会溢出的区域,用来保存线程切换时的执行行数 程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。 由于 Java 虚拟机的多线程是通过线程轮流

2023-02-13 14:56:05 487

原创 再有人问你分布式事务,把这篇文章砸过去给他

事务的具体定义​ 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制数据库本地事务 说到数据库事务就不得不说,数据库事务中的四大特性,ACIDA:原子性(Atomicity)​ 一个事务(transaction)中的所有操作,要么全部完成,要么全部

2023-02-09 13:47:36 297

原创 大哥,这是并发不是并行,Are You Ok?

本文内容整理自 *博学谷狂野架构师 *多线程概述基础概念进程和线程进程是程序运行资源分配的最小单位​ 进程是操作系统进行资源分配的最小单位,其中资源包括:CPU、内存空间、磁盘IO等,同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。​ 进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的

2023-02-08 14:02:46 245

原创 我是如何用CAP和BASE两个基础理论卷死其他组员的?

本文内容整理自博学谷狂野架构师​ CAP 定理又被称作布鲁尔定理,是加州大学的计算机科学家布鲁尔在 2000 年提出的一个猜想。2002 年,麻省理工学院的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明,使之成为分布式计算领域公认的一个定理。​ 布鲁尔在提出CAP猜想时并没有具体定义 Consistency、Availability、Partition Tolerance 这3个词的含义,不同资料的具体定义也有差别,为了更好地解释,下面选择Robert Greiner

2023-02-07 13:57:00 345

原创 Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了

双重检查锁定与延迟初始化 在 java 程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:COPYpublic class UnsafeLazyInitialization { private static Instance instance; public static Instance get

2023-02-02 15:13:47 613

原创 Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了

双重检查锁定与延迟初始化 在 java 程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:COPYpublic class UnsafeLazyInitialization { private static Instance instance; public static Instance get

2023-02-02 15:11:57 790

空空如也

空空如也

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

TA关注的人

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