- 博客(146)
- 资源 (3)
- 收藏
- 关注

原创 基础题库详解
JRE:Java Runtime Environment( java 运行时环境)。即java程序的运行时环境,包含了 java 虚拟机,java基础类库。JDK:Java Development Kit( java 开发工具包)。即java语言编写的程序所需的开发工具包。备注:JDK 包含了 JRE,同时还包括 java 源码的编译器 javac、监控工具 jconsole、分析工具 jvisualvm等。
2024-03-03 19:54:04
463
原创 阿里巴巴开发规范手册MySQL&工程结构
2)【参考】(分层异常处理规约)在 DAO 层,产生的异常类型有很多,无法用细粒度的异常进行 catch,使用 catch(Exception e)方式,并 throw new DAOException(e),不需要打印日志,因为日志在 Manager/Service 层一定需要捕获并打印到日志文件中去,如果同台服务器再打日志,浪费性能和存储。执行 SQL 时,不要更新无改动的字段,一是易出错;说明:在存储的时候,float 和 double 都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。
2025-01-23 23:06:06
862
原创 阿里巴巴规范-异常日志&日记规约&单元测试&安全规约
而应用内部推荐异常抛出;说明:try块中的return语句执行成功后,并不马上返回,而是继续执行finally块中的语句,如果此处存在return语句,则在此直接返回,无情丢弃掉try块中的返回点。说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,可能存在数字格式错误,不得不通过catchNumberFormatException来实现。正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或用户输入密码过于简单,在程序上作出分门别类的判断,并提示给用户。
2025-01-19 20:57:05
941
原创 阿里巴巴开发规范手册_集合处理&并发处理&控制语句&注释规约
8)、使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。使用Map的方法keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出UnsupportedOperationException异常。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
2025-01-13 11:10:40
839
原创 阿里巴巴java开发规范-命名风格&常量定义&代码格式&&OOP 规约
说明:子类、父类成员变量名相同,即使是 public 类型的变量也是能够通过编译,而局部变量在同一方法内的不同代码块中同名也是合法的,但是要避免使用。反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC 框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。3、类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO/ PO / UID 等。
2025-01-10 21:41:25
797
原创 详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)
一方面是为了方便描述,另一方式,更能体现出这些IO的区别。网络IO从Socket获取数据的步骤:1)用户进程执行系统调用转入内核态2)操作系统等待远处客户端发送数据(前提是客户端和服务器通过TCP三次握手成功),客户端发送数据后,操作系统通过从网卡设备获取数据,并把数据从Socket协议栈拷贝到内核缓冲区3)把内核缓冲区的数据拷贝到用户缓冲区4)用户进程获取到数据,继续执行BIO、NIO、AIO的主要区别在于:
2024-12-22 10:54:15
1523
原创 clickhouse-题库
1、clickhouse介绍以及架构1、clickhouse介绍以及架构clickhouse一个分布式列式存储数据库,主要用于在线分析查询2、列式存储和行式存储有什么区别?行式存储:1)、数据是按行存储的2)、没有建立索引的查询消耗很大的IO3)、建立索引和视图花费一定的物理空间和时间资源4)、面对大量的查询,复杂的复杂的数据库必须使用大量性能才能满足列式存储:1)、数据按列存储,每一列单独存放2)、只访问查询设计的列,大量降低系统的IO。
2024-12-20 16:57:18
965
原创 clickhouse-副本和分片
这里有两种区分的方法。一种是从数据层面区分,假设ClickHouse的N个节点组成了一个集群,在集群的各个节点上,都有一张结构相同的数据表Y。换言之,分片之间的数据是不同的,而副本之间的数据是完全相同的。但是在通信的过程中,并不会涉及任何表数据的传输,在查询数据的时候也不会访问ZooKeeper,所以不必过于担心ZooKeeper的承载压力。集群是副本和分片的基础,它将ClickHouse的服务拓扑由单节点延伸到多个节点,但它并不像Hadoop生态的某些系统那样,要求所有节点组成一个单一的大集群。
2024-12-19 10:02:24
1193
原创 clickhouse-数据库引擎
任何一个批次的数据写入都会产生一个临时分区,也就是写入一个新的分区目录,不会纳入任何一个已有的分区。写入后的某个时刻(大概10-15分钟后),ClickHouse会自动执行合并操作(等不及也可以手动通过optimize执行),把临时分区的数据,合并到已有分区中,已经存在的旧分区目录并不会立即被删除,而是在之后的某个时刻通过后台任务被删除(默认8分钟)。如果在 SELECT 查询中没有指定_version,则使用 FINAL 修饰符,返回_version 的最大值对应的数据,即最新版本的数据;
2024-12-18 07:17:19
1296
原创 clickhouse-介绍、安装、数据类型、sql
如果在配置文件中有::,就改成0.0.0.0,因为::是IPv6的通配符,我部署clickhouse的机器不支持ipv6。第一列是限制的用户和用户组,soft软限制,hard硬限制,nofile打开文件数,nproc用户进程数,退出当前用户,重启登录,DBMS的功能:几乎覆盖了标准SQL的大部分语法,包括DDL和DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复;
2024-12-18 06:17:29
1864
原创 SpringCloud 题库
这篇文章是关于 SpringCloud 面试题的汇总,包括微服务的概念、SpringCloud 的组成及相关技术,如服务注册与发现、负载均衡、容错等,还涉及 Nacos 配置中心、服务注册表结构等原理,以及微服务架构中的日志采集、服务网关、相关概念和预防服务雪崩的措施等。在微服务架构中,系统的服务相互调用,有的服务出现宕机现象,如果此时不处理,可能会导致整个系统崩溃。在微服务架构中,存在服务相互调用,而服务的调用链路可能相当复杂,服务的部署和变化非常频繁,为了减少修改源代码,就是用了服务网关。
2024-12-11 11:00:47
440
原创 RocketMQ_详细配置与使用详解
比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。
2024-11-30 11:48:46
1953
1
原创 mysql_题库详解
1、如何创建和删除数据库?1、如何创建和删除数据库?1)创建数据库 CREATE DATABASE 数据库名;2)删除数据库 drop database 数据库名;2、MyISAM与InnoDB的区别?1)事务:MyISAM 不支持事务 InnoDB 支持2)行锁/表锁:MyISAM 支持表级锁 InnoDB 支持行锁和表锁3)MVCC(多版本并发控制):InnoDB 支持 MyISAM 不支持4)外键:MyISAM 不支持 InnoDB支持。
2024-11-29 16:33:12
1171
原创 JVM_总结详解
CPU中,每个CPU又有多级缓存【上图统一定义为高速缓存】,一般分为L1,L2,L3,因为这些缓存的出现,提高了数据访问性能,避免每次都向内存索取,但是弊端也很明显,不能实时的和内存发生信息交换,分在不同CPU执行的不同线程对同一个变量的缓存值不同。由于现代操作系统都是多处理器操作系统,每个处理器都会有自己的缓存,可能存再不同处理器缓存不一致的问题,而且由于操作系统可能存在重排序,导致读取到错误的数据,因此,操作系统提供了一些内存屏障以解决这种问题.但是随着cpu的发展,内存的读写速度也远远赶不上cpu。
2024-11-28 18:10:05
593
原创 jvm_题库详解
上面的代码在堆中会有一个A的实例一个B的实例,且计数属性均为1,执行了第3、4两行代码后,两个实例的引用计数均为2,执行了5、6两行代码后两个实例的计数属性均为1,这时a、b均指向了null,但是堆中的两个实例的计数属性的值却不为0,那么这两个实例无法回收,存在内存泄漏的风险;在 Java 中,引用和对象是有关联的。指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
2024-11-28 16:56:59
691
原创 JVM_栈详解二
即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧(Current Frame),与当前栈帧相对应的方法就是当前方法(Current Method),定义这个方法的类就是当前类(Current Class)。早期绑定就是指被调用的目标方法如果在编译期可知,且运行期保持不变时,即可将这个方法与所属的类型进行绑定,这样一来,由于明确了被调用的目标方法究竟是哪一个,因此也就可以使用静态链接的方式将符号引用转换为直接引用。当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。
2024-11-27 22:00:44
736
原创 JVM_栈详解一
在一个活动线程中,一个时间点上,只会有一个活动的栈帧,即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧(Current Frame),与当前栈帧对应的方法就是当前方法(Current Method),定义这个方法的类就是当前类(Current Class)。如果在该方法中调用了其他方法,对应的新的栈帧就会被创建出来,放在栈的顶端,成为新的当前帧。操作数栈就是jvm执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈是空的。
2024-11-27 16:42:54
734
原创 jvm_根节点枚举&安全点&安全区域
所以,安全点的选定基本上是以 “是否具有让程序长时间执行的特征” 为标准进行选定的,最典型的就是指令序列的复用:例如方法调用、循环跳转、异常跳转等,所以只有具有这些功能的指令才会产生安全点。在 OopMap 的协助下,HotSpot 可以快速完成根节点枚举了,但一个很现实的问题随之而来:由于引用关系可能会发生变化,这就会导致 OopMap 内容变化的指令非常多,如果为每一条指令都生成对应的 OopMap,那将会需要大量的额外存储空间,这样垃圾收集伴随而来的空间成本就会变得无法忍受的高昂。
2024-11-27 15:04:36
855
原创 JVM_垃圾收集器详解
它的单线程的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾手机工作,更重要的是它在进行垃圾手机工作的时候还必须暂停其他的所有工作线程(STW),直到它收集结束。标记-整理算法是根据老年代的特点设计出的一种标记算法。他的标记过程和标记清除算法一样的,后续不同的是,它会先把所有存活的对象规整的移动到一起,然后把边界外的对象统一回收。Serial 虽然是单线程,STW的时间有点长,但是它简单且高效(与其它垃圾收集器相比),它没有线程交互的开销,自然而然的可以获得很高的单线程收集效率。
2024-11-27 09:53:29
986
原创 多线程_题库详解
同一进程的线程共享此线程的资源,当一个线程发生崩溃时,此进程也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题,如死锁等。线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行程序计数器和栈,线程之间切换的开销小。当前线程 CPU 时间片用完后,会让出 CPU 等下次轮到自己时候在执行,系统不会为线程分配内存,线程组之间只能共享所属进程的资源。调用线程的 start() 方法后,线程处于可运行状态,此时它可以由 JVM 调度并执行,这并不意味着线程就会立即运行。
2024-11-26 10:44:11
923
原创 多线程_AQS详解
总结起来,很多同学都对AQS有一种云里雾里的感觉,如果用搜索引擎查一下AQS是什么,估计看几篇文章就直接放弃了,因为密密麻麻的文字,实在是看不懂!接着,线程2会将自己放入AQS中的一个等待队列,因为自己尝试加锁失败了,此时就要将自己放入队列中来等待,等待线程1释放锁之后,自己就可以重新尝试加锁了。他释放锁的过程非常的简单,就是将AQS内的state变量的值递减1,如果state值为0,则彻底释放锁,会将“加锁线程”变量也设置为null!接着,如果线程1加锁了之后,线程2跑过来加锁会怎么样呢?
2024-11-26 09:54:32
614
原创 多线程_基本详解
总结:我们不能通过run方法来新开一个线程,只能调用线程中重写的run方法(可以在线程中不断的调用run方法,但是不能开启子线程,即不能同时干几件事),start是开启线程,再调用方法(即默认开启一次线程,调用一次run方法,可以同时执行几件事)操作共享数据的代码(所有线程共享的数据的操作的代码)(视作卫生间区域(所有人共享的厕所)),即为需要共享的代码(同步代码块,在同步代码块中,相当于是一个单线程,效率低)2)问题出现的原因:当某个线程操作车票的过程中,尚未完成操作时,其他线程参与进来,也来操作车票。
2024-11-26 09:09:33
877
转载 多线程_线程池默认大小为CPU核数的2倍详解
我们都知道使用多线程的本质是为了提升程序的性能,总体来说有两个最核心的指标,一个延迟,一个吞吐量。延迟指的是发出请求到收到响应的时间,吞吐量指的是。这两个指标之间有一定的关联,因为同等条件下延迟越短吞吐量越大,但由于它们是不同的维度,一个是时间,一个是空间,并不能相互转换。>那么第1种情况,对于CPU密集型任务而言,理论上“线程的数量 = CPU核数”就是合适的。有位工作5年的小伙伴问我说,为什么Netty线程池默认大小为CPU核数的2倍,今天,我花2分钟时间给大家专门分享一下我对这个问题的理解。
2024-11-25 19:40:01
258
原创 多线程_wait()和notify()详解
而当wait()释放锁后,notifyThread线程会由阻塞状态尝试竞争锁,并拿到锁,开始执行同步块,当执行到notify()方法后,会将waitThread线程从等待队列中移到同步队列中,即notify方法会触发waitThread线程由WAITING非竞争状态转化为BLOCKED状态;从上面叙述可以看出,不管是notifyThread竞争锁,还是notify之后,waitThread需要重新进入同步队列,重新竞争锁,,最后都需要在阻塞状态下竞争同一个锁对象,,因此,等待/通知机制仍依托于同步机制。
2024-11-25 18:20:09
660
原创 线程池_原理结合源码详解
如果不同的任务的执行时间有长有短,它们被提交到了同一个线程池,一个线程中需要时间短的任务很快被执行完,可能该线程接着就获取到一个时间长的任务,久而久之,线程池的所有线程都可能运行着需要时间长的任务,哪些需要时间短的任务反而都被堵在阻塞队列中无法执行。线程池内部维护了一个阻塞队列,这个队列是用来存储任务的,线程池的基本运行过程就是:线程调用阻塞队列的take方法,如果当前阻塞队列中没有任务的话,线程将一直阻塞,如果有任务提交到线程池的话,会调用该阻塞队列的put方法,并且唤醒阻塞的线程来执行任务。
2024-11-25 16:58:18
736
原创 线程池_线程池详解
1、线程池使用场景?1、线程池使用场景?java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。
2024-11-24 23:30:30
787
原创 集合_基本用法详解
1、集合大纲1、集合大纲2、 集合的基础知识ArrayList:创建对象:ArrayList sites = new ArrayList();输出结果:[Google, Runoob, Taobao]HashSet:创建对象:HashSet sites = new HashSet();
2024-11-24 11:15:00
470
原创 集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解
PriorityQueue是优先队列,作用是保证每次取出的元素都是队列中权值最小的,这里涉及到了大小关系,元素大小的评判可以通过元素自身的自然顺序(使用默认的比较器),也可以通过构造时传入的比较器。从源码中,明显看到PriorityQueue的底层数据结构是数组,而无边界的形容,那么指明了PriorityQueue是自带扩容机制的,具体请看PriorityQueue的grow方法。remove方法和poll方法都是删除队列的头元素,remove方法,队列为空的情况下将抛异常,而poll方法将返回null;
2024-11-24 09:33:56
1208
原创 Caffeine本地缓存
自定义的缓存状态收集器的作用:每当缓存有操作发生时,不管是查询,加载,存入,都会使得缓存的某些状态指标发生改变,哪些状态指标发生了改变,就会自动触发收集器中对应的方法执行,如果我们在方法中自定义的代码是收集代码,比如将指标数值发送到 kafka,那么其它程序从 kafka 读取到数值,再进行分析与可视化展示,就能实现对缓存的实时监控了。直觉告诉我们可能需要一个巨大的 HashMap 来统计各个元素的出现频率,但由于不同的元素的个数可能非常大,以至于是个天文数字,要求的内存可能会非常大,从而不切实际。
2024-11-23 07:59:57
746
原创 ClickHouse的介绍、安装、数据类型
但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重;几乎覆盖了标准SQL的大部分语法,包括DDL和DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复;
2024-11-19 18:00:47
407
原创 面向对象(类和对象、方法、成员变量和局部变量)
1. 对象1.1 万物皆对象定义1:对象就是看得见摸得着的物件(还有一些看不见摸不着的也可以)1.2对象的特征——属性定义1:每个对象都有各自的静态的行为(特征),在计算机中称之为属性定义2:每个属性都有两个部分组成:属性名和属性值1.3对象的特征——方法定义1:每个对象都有各自的动态的行为(方法),在计算机中称之为方法定义2:每个方法都有两个部分组成:方法名称,方法体2. 类2.1类的定义1)多个对象之间的共同的特征(静态的属性和动态的方法)2.2
2024-11-19 09:12:35
321
原创 ClickHouse的介绍、安装、数据类型
但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重;几乎覆盖了标准SQL的大部分语法,包括DDL和DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复;
2024-11-18 10:11:33
659
原创 介绍和安装及数据类型
ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重;这时想查所有人的年龄只需把年龄那一列拿出来就可以了。对于列的聚合、计数、求和等统计操作原因优于行式存储;
2024-11-11 09:33:22
289
原创 数据湖定义
当一个client正在读取v1的数据时,另一个client可以同时写入新的数据,新的数据会被写入新的文件里,不影响v1用到的数据文件。后续的client再读取时,读到的就是v2的数据。如果是 update 消息,写对应的 file group + file slice,直接 append 最新的 log file(如果碰巧是当前最小的小文件,会 merge base file,生成新的 file slice)log file 大小达到阈值会 roll over 一个新的。
2024-10-28 09:26:28
1004
原创 Hadoop生态简介,Hive、Spark、HBase等
Zookeeper采用选举机制选举Leader,其它节点作为Follower或Observer存在,当Leader挂掉之后,会重新选举Leader,但选举的过程需要时间,对于Hadoop这样的计算性集群而言可能不算什么,但对于电商系统这样高速运算的系统而言,集群停摆几秒就可能导致非常严重的后果,所以之前Dubbo这样的中间件使用Zookeepr作为注册中心就具有一定的风险,只要Leader停摆,集群就需要一直等,等待新的Leader上线。
2024-10-26 22:49:07
1302
原创 Hudi 核心知识点详解
:流模式增量读取会持续不断地返回实时更新的结果,而批模式则在查询结束之后退出,需要再次执行查询才能获取更新的数据4。
2024-10-24 09:17:19
610
原创 Mac安装docker(轻松解决安装)
最简单的一个例子,比如说,你在刚开始的一台服务器部署项目,那么部署项目一定要配置mysql等环境是吧,那么现在你要吧这个项目迁移到另一台服务器上,又要重写在另一台服务器上重写配置mysql等环境.可能会出现版本错乱等错误,很麻烦,那么现在第一次部署项目的时候,把项目等环境直接放进docker里面,下次你要迁移项目到另一台服务器上,自己把docker镜像上传到docker仓库上,然后再另一台服务器拉取就直接可以了,这只是好处之一。(如果未安装,可以打开终端,输入以下命令安装Homebrew)
2024-10-05 21:38:11
549
原创 lambda表达式详解
Spliterator是可拆分的,一个Spliterator可以通过调用Spliterator trySplit() 方法来尝试分成两个.一个是this, 一个是新返回的元素.这两个迭代器代表的元素没有重叠。上述代码给forEach() 方法传入一个Lambda表达式,不需要知道accept() 方法,也不需要知道Consumer接口,类型推导已经完成了这些。使用Lambda表达式不需要记忆Predicate接口名,也不需要记忆test() 方法名,只需要此处需要一个返回布尔类型的Lambda表达式。
2024-09-24 13:27:24
707
原创 lamda表达式例子全集详解
List dimGroupAuthVos = List.stream().map(e -> new Model2(model1.属性1(),model1.属性2(),model1.属性3())).collect(Collectors.toList());List 属性数组 = List.stream().map(user -> user.getId()).distinct().collect(Collectors.toList());
2024-09-24 07:46:22
417
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人