自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 项目部署 Java Mysql ES Redis

下载 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip。把文件中的daemonize属性改为yes(表明需要在后台运行)创建目录和文件并且分配属主和属组。添加sql查询账号,特权为只读。把 MySQL 添加进启动项。解压MySQL5.7安装包。复制脚本及PATH变量赋值。这个时候要设置多个账号密码。重启即可(kill)

2023-05-26 10:48:46 947 1

原创 GIT撤回已push的提交/合并已push的提交

GIT撤回push

2022-07-06 10:12:47 970

原创 Java 垃圾回收机制及算法

Java 垃圾回收机制及算法垃圾回收概述什么是垃圾回收说起垃圾收集(Garbage Collection, 下文简称 GC) , 有不少人把这项技术当作 Java 语言的伴生产物。 事实上,垃圾收集的历史远远比 Java 久远, 在1960年诞生于麻省理工学院的 Lisp 是第一门开始使用内存动态分配和垃圾收集技术的语言。垃圾收集需要完成的三件事情:哪些内存需要回收?什么时候回收?如何回收?Java 垃圾回收的优缺点优点:不需要考虑内存管理可以有效的防止内存泄露,有效地利用可使

2021-09-22 14:30:47 699

原创 Thread 线程面试题

Thread 线程面试题线程创建有几种实现方式主要有三种,分为两大类:子线程没有返回值、子线程有返回值。无返回值的线程有两种写法,第一种是继承 Thread,可以这么写:class MyThread extends Thread{ @Override public void run() { log.info(Thread.currentThread().getName()); }}@Testpublic void extendThreadInit(){

2021-07-09 14:53:46 543

原创 Future、ExecutorService 源码解析

Future、ExecutorService 源码解析Thread 或者 Runnable 方法开启的线程是没有返回值,如果我们需要子线程计算,取得结果后返回,可以用 Callable。整体架构关于线程 API 之间关系的依赖图:我们首先看一个 demo,这个场景说的是我们往线程池里面提交一个有返回值的线程,代码如下:public static void main(String[] args) throws ExecutionException, InterruptedException {

2021-07-09 11:19:38 208 2

原创 Thread 源码解析

Thread 源码解析类注释每个线程都有优先级,高优先级的线程可能会优先执行;父线程创建子线程后,优先级、是否是守护线程等属性父子线程是一致的;JVM 启动时,通常都启动 main 非守护线程,以下任意一个情况发生时,线程就会停止:退出方法被调用,并且安全机制允许这么做(比如调用 Thread.interrupt 方法)所有非守护线程都消亡,或者从允许的服正常返回,或者允许的方法抛出了异常;每个线程都有名字,多个线程可能具有相同的名字,Thread 有的构造器如果没有指定名字,会自动生

2021-07-08 15:17:31 517

原创 ArrayBlockingQueue 源码解析

ArrayBlockingQueue 源码解析ArrayBlockingQueue。按照字面翻译,中文叫做数组阻塞队列,从名称上看,我们就比较清楚此阻塞队列底层使用的是数组。一说到数组,大家可能会想到 ArrayList 和 HashMap,举新增场景来说 ArrayList 通过 size ++ 找到新增的数组下标位置,HashMap 通过 hash 算法计算出下标位置,那么 ArrayBlockingQueue 是不是也是这两种方法呢?都不是,ArrayBlockingQueue 使用的是一种非常奇妙

2021-07-02 16:13:54 341 1

原创 LinkedBlockingQueue 源码解析

LinkedBlockingQueue 源码解析说到队列,大家的反应可能是我从来都没有用过,应该不是重要的 API 吧。其实,我们平时使用到的线程池、读写锁、消息队列等等技术和框架,底层都是队列。队列是很多高级 API 的基础,学好队列,对自己深入学习 Java 非常重要。本文主要以 LinkedBlockingQueue 队列为例,详细描述一下底层具体的实现。整体架构LinkedBlockingQueue 直译过来做链表阻塞队列,从命名上就知道其底层数据结构是链表,并且队列是可阻塞的。类图从

2021-06-29 20:28:22 231 1

原创 并发 List、Map 面试题

并发 List、Map 面试题CopyOnWriteArrayList和 ArrayList 相比有什么相同点和不同点相同点:底层数据结构都是数组不同点:CopyOnWriteArrayList 是线程安全的,在多线程环境下使用,无需加锁,可直接使用CopyOnWriteArrayList 通过哪些手段保证了线程安全数组容器用 volatile 关键字修饰,保证了数组内存地址被任意线程修改后,都会通知到其他线程所有对数组的修改操作,都采用 ReentrantLock 加锁,保

2021-06-28 16:12:48 141

原创 ConcurrentHashMap 源码解析和设计思路

ConcurrentHashMap 源码解析和设计思路当我们碰到线程不安全场景下,需要使用 Map 的时候,我们第一个想到的 API 估计就是 ConcurrentHashMap,ConcurrentHashMap 内部封装了锁和各种数据结构来保证访问 Map 是线程安全的,接下来我们一一来看下,和 HashMap 相比,多了哪些数据结构,又是如何保证线程安全的。类注释我们从类注释上可以得到如下信息:所有的操作都是线程安全的,我们在使用时,无需再加锁多个线程同时进行 put、remove 等操作

2021-06-25 16:25:14 121 1

原创 CopyOnWriteArrayList 源码解析和设计思路

CopyOnWriteArrayList 源码解析和设计思路在 ArrayList 的类注释中,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList,这个 List 具有以下特征:线程安全的,多线程环境下可以直接使用,无需加锁通过锁 + 数组拷贝 + volatile 关键字保证了

2021-06-22 15:47:23 171

原创 集合面试题

集合面试题线程安全我们说集合都是非线程安全的,这里说的非线程安全指的是集合类作为共享变量,被多线程读写的时候,才会线程不安全。如果要实现线程安全的集合,JDK 推荐我们使用 Collections.synchronized* 类,Collections 帮我们实现了 List、Set、Map 对应的线程安全的方法:图中实现了各种集合类型的线程安全的方法,我们以 SynchronizedList 为例,从源码上来看下,Collections 是如何实现线程安全的:static class Synch

2021-06-22 14:30:41 138

原创 Map源码会问哪些面试题

Map源码会问哪些面试题Map 整体数据结构类问题说一说 HashMap 底层数据结构JDK1.8,HashMap底层是数组 + 链表 + 红黑树的数据结构。数组的主要作用是方便快速查找,时间复杂度为 O(1),默认大小为16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组的元素叫做 Node,当不同的 key 的 hashcode 相同时(hash冲突),Node 会转换成链表,链表的查询复杂度的 O(n),当链表的长度大于等于 8 并且数组的大小大于等于 64 时,链表会进

2021-06-21 19:44:42 109

原创 TreeMap 和 LinkedHashMap 核心源码解析

TreeMap 和 LinkedHashMap 核心源码解析在了解 TreeMap 之前,我们来看下日常工作中排序的两种方式,作为我们学习的基础储备,两种方式的代码如下:public class TreeMapDemo { @Data // DTO 为我们排序的对象 class DTO implements Comparable<DTO> { private Integer id; public DTO(Integer id) { this.id

2021-06-21 17:23:15 178

原创 HashMap 源码解析

HashMap 源码解析HashMap 源码很长,面试的问题也非常多,但这些面试问题,基本都是从源码中衍生出来的, 所以我们只需要弄清楚其底层实现原理,回答这些问题就会游刃有余。整体架构JDK1.8 中 HashMap 底层的数据结构是: 数组 + 链表 + 红黑树。当链表的长度大于等于 8 时,链表会转换成红黑树,当红黑树的大小小于等于 6 时,红黑树会退化为链表,整体的数据结构如下:图中竖这的是 HashMap 的数组结构,数组的元素可能是单个 Node,也可能是个链表或红黑树。比如数组下标为

2021-06-21 16:14:43 93

原创 List 源码会问哪些面试题

List 源码会问哪些面试题说说你自己对 ArrayList 的理解很多面试官喜欢这样子开头,考察面试者对 ArrayList 有没有总结经验,介于 ArrayList 内容很多,建议先回答总体架构,再从某个细节出发作为突破口,比如这样:ArrayList 底层数据结构是个数组,是有序的集合并且可以重复,支持null值,支持随机读写能力,是非线程安全的。其 API 都做了一层对数组底层访问的封装,ArrayList 集合在调用无参构造方法实例化的时候,并没有创建数组,而是在用户第一次执行添加的时候进

2021-06-21 14:24:45 92

原创 LinkedList 源码解析

LinkedList 源码解析LinkedList 适用于集合元素先入先出和陷入后出的场景,在队列源码中频繁被使用。整体架构LinkedList 底层数据结构是一个双向链表,整体结构如下图所示:上图代表了一个双向链表结构,链表中的每个节点够可以向前或者向后追溯链表每个节点我们叫做 Node,Node 有 prev 属性,代表前一个节点的位置next 属性代表后一个节点的位置first 是双向链表的头节点,它的前一个节点是 nulllast 是双向链表的尾节点,它的后一个节点是 n

2021-06-19 17:12:29 150

原创 ArrayList 源码解析和设计思路

ArrayList 源码解析和设计思路整体架构ArrayList 整体架构比较简单,就是一个数组结构,比较简单,如下图:图中展示是长度为 10 的数组,从 1 开始计数,index 表示数组的下标,从 0 开始计数,elementData 表示数组本身,源码中除了这两个概念,还有以下三个基本概念:DEFAULT_CAPACITY 表示数组的初始大小,默认是10,这个数字要记住;size 表示当前数组的大小,类型 int ,没有使用 volatile 修饰,非线程安全的;modCount 统计

2021-06-19 14:54:57 138

原创 Java 常用关键字理解

Java 常用关键字理解Java 中的关键字很多,大约有 50+,在命名上我们不能和这些关键字冲突,编译会报错,每个关键字都代表着不同场景下的不同含义。static意思是静态的、全局的,一旦被修饰,说明被修饰的东西在一定范围内是共享的,谁都可以访问,这时候需要注意并发读写的问题。修饰的对象static 只能修饰类变量、方法和代码块修饰类变量当 static 修饰类变量时,如果该变量时 public 的话,表示该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.变量 这种形式访问即可。

2021-06-18 16:58:36 227

原创 String 和 Long 的面试题

String 和 Long 的面试题String不变性我们常常听人说,HashMap 的 key 建议使用不可变类,比如 String 这种不可变类。这里说的不可变指的是类值一旦被初始化,就不能再改变了,如果被修改,将会是新的类。String s = "hello";s = "world";从代码上来看,s 的值好像被修改了,但从 debug 的日志来看,其实 s 的内存地址以及被修改了,也就是 s = "world" 这个赋值操作,其实已经把 s 的引用指向了新的 String。我们从

2021-06-18 14:35:28 135

原创 es in查询

{ "query": { "bool": { "must": [], "filter": [ { "bool": { "should": [ { "match": { "reason": "使用物品" } } ],

2021-04-13 19:10:23 6813

原创 面经手册 —— 谈谈对 CAS 的理解

面经手册 —— 谈谈对 CAS 的理解题目描述提问线路: CAS => Unsafe => CAS 底层原理 => 原子更新 => 如何规避 ABA 问题面试题分析compareAndSet 怎么用?import java.util.concurrent.atomic.AtomicInteger;public class Main { /** * boolean compareAndSet(int expect,int update) *

2021-04-02 18:05:57 219

原创 SpringBoot 调用公共模块的自定义注解失效

项目结构如下:我在 bi-common 公共模块里定义了一个自定义注解,实现AOP记录日志,bi-batch 项目已引用了 bi-common ,当在 bi-batch 使用注解的时候,没有报错,但是切面却失效。自定义注解:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface JobLog {}切面实现:/** * 执行任务时记录日志 */@Aspect@Component

2021-03-11 20:56:28 1276 1

原创 LRU算法

LeetCode 地址 LRU 缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容

2021-03-04 11:15:53 103 1

原创 MySQL集群架构 —— 集群架构设计

MySQL集群架构 —— 集群架构设计集群架构设计架构设计理念在集群架构设计时,主要遵从下面三个维度:可用性站点高可用,冗余站点服务高可用,冗余服务数据高可用,冗余数据**保证高可用的方法是冗余。**但是数据冗余带来的问题是数据一致性的问题。实现高可用的方案有以下几种架构模式:主从模式灵活简单,能满足多种需求。比较主流的用法,但是写操作高可用需要自行处理。双主模式互为主从,有双主双写、双主单写两种方式。建议使用双主单写。扩展性扩展性主要围绕着读操作扩展和

2021-03-02 10:57:58 446

原创 MySQL 锁机制

MySQL 锁机制锁分类在 MySQL 中,锁有很多不同的分类从操作的粒度可分为表级锁、行级锁和页级锁表级锁:每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:每次操作只锁住一行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。页级锁:每次锁定相邻的一组记录,锁定粒度界于表锁和行锁之间,开销和加锁时间界于表锁和行锁之间,并发度一般。应用在BDB 存储引擎中。行锁表锁页锁MyISAM✔️BDB✔️✔️

2021-02-26 15:30:18 131

原创 MySQL事务

MySQL事务ACID 特性在关系型数据库管理系统中,一个逻辑工作单元要成为事务,必须满足这 4 个特性,即所谓的 ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。原子性原子性指的是:事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全部不执行数据修改 => Buffer Pool => 刷盘。可能会有下面两种情况:事务提交了,如果此时 Buffer Pool 的脏页没有刷盘,如何

2021-02-25 15:38:26 140

原创 MySQL 索引分析与优化

MySQL 索引分析与优化EXPLAINMySQL 提供了一个 EXPLAIN 命令,它可以对 SELECT 语句进行分析,并输出 SELECT 执行的详细信息,供开发人员有针对性的优化。例如;explain select * from t_user where id < 3;输出如下:mysql> explain select * from t_user where user_id < 3 \G*************************** 1. row *****

2021-02-23 17:36:09 145

原创 MySQL 索引原理

MySQL 索引原理索引可以提升查询速度,会影响 where 查询,以及 order by 排序等。索引类型MySQL 索引类型如下:从索引存储结构划分:B Tree索引、Hash索引、FULLTEXT 全文索引、R Tree索引从应用层次划分:普通索引、唯一索引、主键索引、复合索引从索引键值类型划分:主键索引、辅助索引(二级索引)从数据存储和所有键值逻辑关系划分:聚簇索引(聚集索引)、非聚簇索引(非聚集索引)普通索引这是最基本的索引类型,基于普通字段建立的索引

2021-02-22 20:23:06 294

原创 MySQL 日志

MySQL 日志Undo LogUndo Log 介绍undo:意为撤销或取消,以撤销操作为目的,返回指定某个状态的操作。Undo Log:数据库事务开始之前,会将要修改的记录存放到 Undo 日志里,当事务回滚时或者数据库崩溃时,可以利用 Undo Log,撤销未提交事务对数据库产生的影响。Undo Log 的生命周期:Undo Log 在事务开始前产生;事务在提交时,并不会立刻删除 undo log,InnoDB 会将该事务对应的 undo log 放入删除列表中,后面会通过后台线程 pur

2021-02-08 15:23:08 262

原创 InnoDB 线程模型

InnoDB 线程模型IO Thread在 InnoDB 中使用了大量的 AIO(Async IO)来做读写处理,这样可以极大提高数据库的性能。在 InnoDB 1.0 版本之前共有 4 个 IO Thread,分别是 write、read、insert buffer 和 log thread,后来版本将 read thread 和 write thread 分别增大到了4个,一共有10个了。read thread:负责读取操作将数据从磁盘加载到缓存 page 页(4个线程)write

2021-02-03 16:25:10 193

原创 InnoDB 存储结构

文章目录InnoDB 存储结构InnoDB 内存结构Buffer PoolPage 管理机制改进版的 LRU 算法维护Buffer Pool 配置参数Change BufferAdaptive Hash IndexLog BufferInnoDB 磁盘结构表空间(Tablespaces)系统表空间(The System Tablespaces)独立表空间(File-Per-Table Tablespaces)通用表空间(General Tablespaces)撤销表空间(Undo Tablespaces)临

2021-02-03 10:38:05 512

原创 MySQL 存储引擎简介

MySQL 存储引擎简介存储引擎在 MySQL 的体系架构中位于第三层,负责 MySQL 中的数据的存储和提取,是与文件打交道的子系统,它是根据 MySQL 提供的文件访问层抽象接口定制的一种文件访问机制,这种机制就叫做存储引擎。使用 show engines 命令,就可以查看当前数据库支持的引擎信息:在 5.5 版本之前 MySQL 默认采用 MyISAM 存储引擎,从 5.5 开始采用 InnoDB 存储引擎。InnoDB:支持事务,具有提交、回滚和崩溃恢复能力,事务安全MyISAM:不支

2021-01-27 19:36:42 96

原创 MySQL 运行机制

MySQL 运行机制建立连接建立连接(Connectors&Connection Pool),通过客户端/服务器通信协议与 MySQL 建立连接。MySQL 客户端与服务端的通信方式是“半双工”。对于每一个 MySQL 的连接,都有一个线程状态来表示这个连接正在做什么。通信机制:全双工:能同时发送和接收数据,例如平时打电话。半双工:指的某一时刻,要么发送数据,要么接收数据,不能同时。例如早期对讲机。单工:只能发送数据或只能接收数据。例如单行道。线程状态:show proce

2021-01-26 19:56:52 276 2

原创 MySQL 体系架构

MySQL 体系架构MySQL Server 架构自顶向下大致可以分为 网络连接层、服务层、存储引擎层和系统文件层。网络连接层客户端连接器(Client Connectors):提供与 MySQL 服务器建立的支持。目前几乎支持所有主流的服务端编程技术,例如常见的 Java、C、Python、.NET 等,它们通过各自的 API 与MySQL 建立连接。服务层(MySQL Server)服务层是 MySQL Server 的核心,主要包括系统管理和控制工具、连接池、SQL接口,解析器、查询优

2021-01-26 14:21:12 163

原创 Spring Cloud Netflix 常见问题及解决方案

Spring Cloud Netflix 常见问题及解决方案Eureka 服务发现慢的原因场景:上线一个新的服务实例,但是服务消费者无感知,过了一段时间才知道某一个服务实例下线了,服务消费之无感知,仍然向这个服务实例在发起请求这其实就是服务发现的一个问题,当我们需要调用服务实例时,信息是从注册中心 Eureka 获取的,然后通过 Ribbon 选择一个服务实例发起调用,如果出现调用不到或者下线后还可以调用的问题,原因肯定是服务实例的信息更新不及时导致的。Eureka 服务发现慢的原因有两个,

2021-01-22 17:47:11 829

原创 Hystrix 熔断器

Hystrix 熔断器服务雪崩在微服务架构中,一个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调用完成。这就带来一个问题,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。最下游简历微服务响应时间过长,大量请求阻塞,大量线程不会释放,会导致服务器资源耗尽,最终导致上游服务甚至整个系统瘫痪。雪崩效应解决方

2021-01-20 15:43:17 230

原创 Eureka Server 启动过程源码分析

Eureka Server 启动过程SpringBoot 自动装配入口:SpringCloud 充分利用了 SpringBoot 的自动装配特点,在 eureka-server 的jar包下,META-INFO 文件夹下有配置文件 spring.factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.netflix.eureka.server.Eureka

2021-01-18 15:25:09 175

原创 Kafka副本机制详解

Kafka副本机制详解所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。副本机制在分布式系统下有以下好处:提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。提供高伸缩性。支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。改善数据局部性。允许将数据放入与用户地理位置相近的地方,从而降低系统延时。这些优点都是在分布式系统中最常被提及的,但是有些遗憾的是,对于

2020-12-19 17:46:12 1035 1

原创 如何监控 Kafka 消费者组消费进度?

如何监控 Kafka 消费者组消费进度?对于 Kafka 消费者来说,最重要的事情就是监控它们的消费进度了,或者说是监控它们消费的滞后程度。这个滞后程度有个专门的名称:消费者 Lag 或 Consumer Lag。所谓滞后程度,就是指消费者当前落后于生产者的程度。比方说,Kafka 生产者向某主题成功生产了 100 万条消息,你的消费者当前消费了 80 万条消息,那么我们就说你的消费者滞后了 20 万条消息,即 Lag 等于 20 万。通常来说,Lag 的单位是消息数,而且我们一般是在主题这个级别上讨

2020-12-19 16:02:55 3336 3

空空如也

空空如也

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

TA关注的人

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