- 博客(58)
- 资源 (3)
- 收藏
- 关注
原创 MySQL的binlog日志
前言相信很多用过MySQL开发的程序员们都知道binlog,binlog可以用来归档,也可以用来做主备同步。毫无夸张地说,MySQL能够成为现今最流行的数据库,binlog功不可没,今天就来分享一下binlog里面的内容binlog三种格式对比相信大家都知道binlog有两种格式,一种是statement,一种是row,但是还会从别的资料看到第三种格式,叫mixed,mixed其实就是前面两种格式的混合为了描述三种格式的区别,我先来创建一张表,并且初始化5条数据create table t( i
2021-11-20 14:51:12
938
1
原创 hutool工具类的时间使用
前言由于小编最近开发的功能都是爬取api的数据,一直需要操作时间,所以使用了一段时间的hutool工具类,发现是真的方便,所以分享博客记录一下,方便以后开发回来可以直接找到相关的apiDateUtilDateUtil中都是静态方法,方便调用String now() 表示当前时间yyyy-MM-dd HH:mm:ssString today() 表示今天时间yyyy-MM-ddint thisMonth()。表示月份(从0开始)int thisDayOfMonth() 表示本月第几天(从1
2021-09-19 14:34:06
4022
1
原创 MySQL之索引下推
说到索引下推之前,我们先讲一下“覆盖索引”,也称为“联合索引”覆盖索引一张表名为test,有两个字段name和age,建立联合索引idx(name,age)表的数据为(“张三”,18),(“李四”,24),(“王五”,35)然后开始用select * from test where name='张三'可以直接匹配到(“张三”,18)这条记录。但是使用select * from test where name like '张%'就会查询(“张三”,18)这条记录,然后继续往后查询,直到没有匹配上的记
2021-09-04 13:56:18
492
转载 Java8 lambda表达式
java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对比,能少写不少代码。实体类import java.math.BigDecimal;import java.util.Date; public class User { private Long id; //姓名 private String name; //年龄 private int age; //工号
2021-07-31 13:27:36
210
原创 阿里云oss图片上传
背景上周接到一个新的需求,要在客户端上报图片信息,以前是存在七牛上,现在要全部转到阿里云的oss上,然后那周基本都在啃阿里云的官方文档,最后完成了这个需求,现在来分享一下Java开发的SpringBoot项目怎么引入oss并且使用还有我的踩坑经历。阿里云oss使用1、先引入maven依赖 <dependency> <groupId>com.aliyun.oss</groupId> <artifac
2021-06-19 20:48:31
471
6
原创 阿里云日志配置告警
背景我所在的公司目前用的是ELK日志查询,但是用ELK都是出了问题我们开发人员上去查询对应的报错日志最后解决问题。但是出了问题我们开发人员要怎么知道的,只能通过业务人员反馈才能知道。所以我们后面就把日志服务迁移到阿里云日志服务上,可以查询、分析日志也可以配置相对应的告警功能。配置告警功能一、创建用户和用户组用户和用户组的作用是告警通知的对象,下面是创建步骤。登录阿里云,选择日志服务在Project区域中选择你想要配置的目标Project在左侧导航栏中选择告警打开告警中心,选择告警管理>
2021-06-12 12:54:53
1908
7
原创 JVM的类加载过程
前言近来读了《深入理解JVM虚拟机》的部分内容,对JVM也慢慢有个整体的认识,今天就来分享一下我对JVM类加载过程的学习和理解。基础知识我们平时写的Java写代码一般都是.java文件,编译成为.class字节码文件,然后类加载器把.class文件加载到JVM内存中,接下来JVM就执行我们的字节码文件,整个过程就是这样。画个图方便大家好理解:类加载过程其实非常琐碎且复杂,但是我们只要把握其中的核心工作原理即可一个类从加载到使用会经历以下步骤:加载-〉验证-〉准备-〉解析-〉初始化-〉使用-〉
2021-05-29 16:19:27
251
5
原创 JVM核心参数图解
前言作为一名Java开发工程师,基本上都要接触到JVM,实际开发中也许也会遇到JVM的相关问题,面试中肯定也会问到JVM的相关知识。所以今天这篇主要分享JVM的各个参数所代表的意思并且通过图解的方式帮助读者更加好理解。JVM核心参数在JVM里有几个比较核心的参数,今天就主要来讲这几个:-Xms:JVM初始堆内存大小-Xmx:JVM堆内存的最大值-Xmn:JVM中新生代大小-XX:PermSize:永久代大小-XX:MaxPermSize:永久代最大值-Xss:JVM每个线程的大小下面我们
2021-05-15 11:31:35
929
4
原创 JVM定位问题之jstack使用
背景本人在刚开始接触企业级开发的时候,就曾经写过一段类似于死循环的代码。然后把这个代码发布到线上,Grafana显示改应用上线后CPU一直接近100%,于是在大佬的帮助下用jstack定位到问题并且解决了,所以总结一下jstack的使用吧。jstack描述此命令是为Java进程或核心文件或远程调试服务器打印Java线程的堆栈跟踪。jstack可以同时打印所有线程的Java和本机栈帧。jstack常用于定位线程的死循环、死锁等情况。场景模拟package JVM;import java.util
2021-05-03 15:49:09
1942
4
原创 MySQL的间隙锁
你好,我是god-jiang~接上篇的MySQL行锁,我分享了RC隔离级别下的各种常见情况的加锁分析。这次分享的是MySQL间隙锁,分析RR隔离级别下各种常见情况的加锁分析。create table `test`( `id` int(11) NOT NULL, `a` int(11) NOT NULL, `b` int(11) NOT NULL, `c` int(11) NOT NULL, PRIMARY KEY(`id`), UNIQUE KEY unix_key('a'),
2021-03-20 17:47:57
612
10
原创 MySQL的行锁
背景自从过年值班就一直在公司读《 MySQL实战45讲》这本书,当时看完了MySQL的全局锁、表级锁还有行锁和间隙锁。其中的行锁和间隙锁迟迟无法理解,最近趁着有空再次阅读了一遍,并且对照了《深入浅出MySQL》,发现对MySQL锁的理解又上了一个台阶,今天就来分享一下MySQL的行锁。行锁MySQL的行锁又分为共享锁(S锁)和排他锁(X锁)。一般普通的select语句,InnoDB不加任何锁,我们称之为快照读select * from test;通过加S锁和X锁的select语句或者插入/更
2021-03-12 22:41:17
10267
16
原创 MySQL的全局锁和表级锁
前言在真实的企业开发环境中使用MySQL,MySQL肯定不会只有我一个人使用,而是一个团队显式的使用MySQL,或者是业务隐式的使用MySQL,那么多个用户或者客户端连接使用的时候,我们应该考虑一个问题:如果保证数据并发访问的一致性呢?这一篇我就来聊聊MySQL的锁,不涉及MySQL的事务隔离级别。全局锁MySQL的全局锁会关闭所有打开的表,并使全部的表处于只读状态,它们的命令为:# 全局锁,简称FTWRLFLUSH TABLES WITH READ LOCK;# 解锁命令UNLOCK TA
2021-02-27 18:35:25
1494
10
原创 MySQL日志之redo log和binlog
前言只要是接触过MySQL的程序员,那么或多或少都有听过redo log(重做日志)和binlog(归档日志)。今天就来分享一下这两个日志的用处和区别。简单来说,redo log是InnoDB特有的日志,如果使用的是其他存储引擎,就没有redo log,只有binlog。binlog是MySQL的Server层的日志,不管使用什么存储引擎,都会有binlog的存在。那么,为什么要有redo log和binlog呢?一个binlog不就可以全部解决了吗?接下来我们就来详细看一下redo log和binl
2021-02-15 14:07:53
2533
8
原创 MySQL的基础架构
前言临近春节,这段时间闲来无事又读了一些关于MySQL的文章和书籍,觉得受益良多。尤其是阿里巴巴丁奇的MySQL实战45讲,真的让我感觉到有质的提升。以前看书看博客都是优先看索引部分,优化部分。都是一些工作中常用的知识点。但现在我对MySQL的底层越来越好奇,所以从MySQL的基础架构开始学起,就有了这篇博客。MySQL逻辑结构大体来说,MySQL可以分为Server层和存储引擎层两部分。Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能以及内置函数。
2021-02-10 11:19:14
2526
10
原创 手撸一个SpringBoot-Starter
前言SpringBoot几乎是我们所有Java开发者必须掌握的一个技能,它为所有开发者更快的入门,做到开箱即用,没有冗余的代码和XML配置要求,对于开发者来说几乎是“零配置”。这个得益于SpringBoot的“约定大于配置”。SpringBoot的starter帮我们把繁琐的配置和注册到IOC容器的过程都做了,我们只需要按照约定配置就可以开箱即用,实现零配置,下面我们就手撸一个spring-boot-starter来加深对“零配置”和“约定大于配置”的理解吧。spring-boot-starter介绍
2021-02-01 22:29:56
2839
15
原创 Spring自带的线程池ThreadPoolTaskExecutor
前言上一篇分享了JDK自带的线程池ThreadPoolTaskExecutor的配置和参数详解,然而我们实际开发中更多的是使用SpringBoot来开发,Spring默认也是自带了一个线程池方便我们开发,它就是ThreadPoolTaskExecutor,接下来我们就来聊聊Spring的线程池吧。Spring默认线程池simpleAsyncTaskExecutorSpring异步线程池的接口类是TaskExecutor,本质还是java.util.concurrent.Executor,没有配置的情况
2021-01-24 23:18:08
993
8
原创 JDK线程池之ThreadPoolExecutor
前言在真实的企业开发过程中,有时候我们需要通过并行计算提高程序执行的性能,或者是遇到等待网络、IO响应导致耗费大量的执行时间,这些情况下我们可以通过采用异步多线程的方式来减少阻塞。这个时候我们就要学习多线程并发来实现这些业务场景。使用线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗提高响应速度。当任务到达时,可以不需要等待线程的创建就能立刻执行提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配、调优
2021-01-17 15:13:16
531
3
原创 SpringBoot定时任务+自定义线程池
背景在真实的Java开发环境中,我们经常会需要用到定时任务来帮助我们完成一些特殊的任务,比如我最近写的晚上11点定时拉取第三方的数据入库,晚上12点清理脏数据等等。如果我们使用SpringBoot来开发,那么定时任务将会变得非常简单。SpringBoot默认已经帮我们封装好了相关定时任务的组件和配置,我们只需要在相应的地方加上@Schedule注解就可以实现定时任务。启动定时任务SpringBoot项目只需要在启动类上加上@EnableScheduling即可开启定时任务@SpringBootAp
2021-01-12 22:58:54
3324
3
原创 Java反射机制
反射机制概念Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够动态调用它的任意一个方法和属性;这个动态获取信息以及动态调用对象的方法的功能称为Java语言的反射机制。在Java的设计模式和流行框架中,反射机制被大量的使用,如果不深刻理解Java反射机制,是无法理解Java的设计模式或阅读流行框架底层代码的。反射机制提供的功能在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时访问一个类所具有的成员变量在运行时调用任意一个
2021-01-02 18:50:03
2031
2
原创 Java之自定义注解
什么是注解?Annotation是JDK5.0开始引入的技术Annotation的作用可以对程序作出解释(和注释没什么区别),可以被其他程序读取Annotation的格式是以“@注释名“在代码中存在的,还可以添加参数值,如@SuppressWarnings(value = “all”)Annotation可以附加在package,class,method,field等上面,给他们添加额外的辅助信息,可以配合反射实现对元数据的访问Java内置注解@Override:定义在java.lang.
2020-12-27 22:34:03
377
原创 SpringBoot自动配置(源码解读)
背景我参加SpringBoot项目开发也已经五个多月时间了,项目遇到一个大数据量文本的取存问题,DBA不允许我们存text或者blob类型的数据在MySQL中,不得已采取了ElasticSearch作为一个中间数据库使用,然后根据网上的方法把maven依赖导入,application.properties粘贴过来,发现已经引入了ElasticSearch这个组件,最后把问题解决了。但是这也引发了我的思考,为啥SpringBoot可以自动识别并且帮我初始化ES呢?阅读了SpringBoot源码,我按照我的
2020-12-15 21:37:49
2630
9
原创 解读阿里巴巴开发规范之MySQL
前言从7月份毕业开始算起,也是将近有5个月的工作经验了吧。在工作上,经历了一段时间的适应,现在接触到不同大神写出来的代码,发现各有优劣,于是就在思考一个问题,什么样的代码才是最正常最规范的呢?我的同事甩给我了一本《阿里巴巴Java开发手册》,从头到尾也算是过了一遍。今天趁着双休的假期,我就来讲一下这本书里面的MySQL规范制约吧~~~阿里巴巴开发规范之MySQL建表规约1、【强制】每张表必须设置一个主键ID,并且这个主键ID要自增(在满足需要的情况下尽量短),除非是分库分表理解:由于InnoDB存
2020-11-28 15:01:44
1047
原创 聊聊MySQL的COUNT(*)的性能
前言基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢?其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一个操作,那么我们应该用哪个方法统计会更快呢?接下来我们就来聊一聊MySQL中统计总行数的方法和性能。count(*),count(1),count(主键)哪个更快?1、建表并且插入1000万条数据进行实验测试:# 创建测试表CREATE TABLE `t6` ( `id` int(
2020-11-17 21:56:11
5028
17
原创 MySQL优化之超大分页查询
背景基本上只要是做后台开发,都会接触到分页这个需求或者功能吧。基本上大家都是会用MySQL的LIMIT来处理,而且我现在负责的项目也是这样写的。但是一旦数据量起来了,其实LIMIT的效率会极其的低,这一篇文章就来讲一下LIMIT子句优化的。LIMIT优化很多业务场景都需要用到分页这个功能,基本上都是用LIMIT来实现。建表并且插入200万条数据:# 新建一张t5表CREATE TABLE `t5` ( `id` int NOT NULL AUTO_INCREMENT, `name` va
2020-11-10 21:46:15
3600
14
原创 MySQL索引(三)索引不生效的情况
背景经历了前面两篇的介绍MySQL索引,相信大家也可以很清晰的认识到索引。这一节想分享一下在MySQL中给字段加了索引,但是查询的时候却不生效索引的情况,让更多的开发者可以少踩坑,接下来直接进入正文~~~为什么索引不生效在上一篇MySQL(二)如何设计索引我们有提到过,MySQL使用的是基于成本的优化器,但是由于查询优化技术是关系型数据库实现中的难点,因此总会有一些索引不生效的情况。接下来我们先建立一张表,并且插入模拟数据,来分析什么情况索引不生效。CREATE TABLE `t4` ( `i
2020-11-07 14:55:35
2322
原创 MySQL索引(二)如何设计索引
背景到这一篇文章,我就已经默认你阅读完了前面的MySQL文章。你可能已经知道了索引本质就是一种数据结构,来加快查询效率的。但是索引要怎么设计呢?这就是这一篇文章的目的。网上有很多博客会讲到最佳实践,比如单表索引数不能超过5个,联合索引中的字段不能超过5个等等。我只能说这些都是扯淡,任何实践都要放在特定的场景才能生效,所以接下来我们来聊聊索引设计吧。索引设计的误区1、单表索引数不超过5个索引本质上就是一种数据结构,然而我们可以把索引映射到现实生活中,就好比是《深入浅出MySQL》这本书前面的目录。难
2020-11-03 20:50:36
855
2
原创 MySQL索引(一)介绍索引
背景想象一下,你去图书馆找到一本你喜欢看的书,然后你想要快速知道这本书讲了什么内容,有哪些章节,都是通过书开头的“索引”部分,如果想要在一本书中找到某个特定主题,一般会先看书的“索引”,找到对应的页码。在MySQL中,存储引擎用类似的方法使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。接下来就来讲讲MySQL的索引吧。索引 索引是应用程序设计和开发的一个重要方面。如果索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响。要找到一个平衡点,这对于
2020-11-01 22:29:26
511
原创 MySQL怎么定位慢查询还有分析执行计划
背景大学期间就自学了MySQL数据库,懂得了怎么写简单的SQL查询数据,怎么多表查询。我还一直认为MySQL也不难呀,直到工作了才知道,原来我还是太年轻了~~~工作期间,写一个简单的CRUD就会碰到上千万的数据量,这个时候简单的select *就会花费大量的时间在查询上,这是不可容忍的。加上我公司的DBA会开启慢查询日志,还有连接接口报警,我才发现只会简单的MySQL是远远不够的,通过看书和学习总结,于是有了这篇博客。定位慢查询在我实际工作中,碰到某个功能或者接口需要等待很长的时间才响应的话,我们就
2020-10-27 21:16:47
634
原创 JVM必会Java GC,助你过五关斩六将
前言都知道《深入理解Java虚拟机》这本书对Java开发是非常重要的,几乎达到了一个必读的重要性。但是在校期间一直看不深入,就停留在最表面的意思,无法深入理解。经历了几个月的码农生活,再次回过头来看这本书的时候,我发现了许多以前不懂的东西都慢慢看懂了,所以借此机会写下这一篇Java GC。Java GC的目标遇到一个问题或者一个知识点,我们首先要理解和思考为什么要解决这个问题。说到GC的目的是什么呢?显然是回收JVM的内存,因为JVM分配的内存是有限的,随着程序创建的对象越来越多,如果不进行GC的
2020-10-07 19:08:11
359
2
原创 Redis分布式锁背后的原理
什么是分布式锁?分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。分布式锁需要具备哪些条件?互斥性:在任意一个时刻,只有一个客户端持有锁。无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁。场景以前大学照着网上的项目视频做商城的时候,用到Redis。不过基本上都是用来当缓存,但是实际上的应用远不
2020-10-04 19:46:38
2148
6
原创 Redis必会知识点总结
Redis简介Redis是完全开源的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。Redis优势性能极高。Redis读的速度是110000
2020-09-18 22:09:13
446
原创 MySQL的隔离级别
前言从校园到企业工作也有一个多月的时间了,经常也是跟MySQL打交道,正好梳理一下MySQL的隔离级别。这个也是面试的时候经常问到的一个知识点,我就来分享一下我的理解。PS:MySQL事务都是指在InnoDB引擎下,MyISAM引擎不支持事务。事务的ACID特性事务都会具有这四种特性:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。简称为ACID特性。原子性。事务是数据库的逻辑工作单位,事务的各操作要么都完成,要么
2020-08-15 12:48:52
1157
原创 Java程序员校招面试——操作系统
前言现在是2020年7月下旬,应该很多互联网大厂开始了他们的秋招提前批吧。然而很多大四学生要参加提前批的话需要有扎实的数据结构基础和刷算法题的能力之外,到了面试环节,面试官比较喜欢考察计算机网络和操作系统的原理,今天就让我来分享我当初校招遇到的常见操作系统的面试题。常见面试题1、简单介绍进程和线程以及它们的区别进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单
2020-07-22 19:59:36
1422
原创 Java程序员校招面试——计算机网络
前言现在是2020年7月中旬,应该很多互联网大厂开始了他们的秋招提前批吧。然而很多大四学生要参加提前批的话需要有扎实的数据结构基础和刷算法题的能力之外,到了面试环节,面试官比较喜欢考察计算机网络和操作系统的原理,今天就让我来分享我当初校招遇到的常见计算机网络的面试题。常见的面试题1、讲一下TCP的三次握手过程?第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Number
2020-07-11 11:49:41
1661
1
原创 荷兰国旗问题&快排&BFPRT算法
荷兰国旗问题给定一个数组arr和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度为O(1),时间复杂度为O(N)解决思路初始化less=-1,more=len(arr),当前位置为cur=0。如果arr[cur]<num,交换arr[cur]和arr[++less]的数,然后cur++如果arr[cur]>num,交换arr[cur]和arr[–more]的数,然后cur不变如果当前位置上的数等于nu
2020-05-11 13:41:39
573
原创 Spring(二)
前言我相信只要是学Java的,都有接触到Spring框架。然后Spring框架最核心的就是IOC(控制反转)和AOP(面向切面编程)。出去找工作,面试官看到你简历上写着熟悉Spring,基本都会问IOC和AOP,今天就来记录一下这两个东西吧。IOC介绍**IOC容器:**它是一个具有依赖注入功能的容器,可以创建对象。IOC容器负责在应用程序中实例化、定位和配置对象,并在这些对象之间建立依...
2020-05-05 19:09:16
385
原创 Spring(一)
1、Spring的历史简介Spring:翻译成春天,代表给软件行业带来了春天~2002年,首次推出了Spring框架的雏形:interface21框架~Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布了1.0正式版~Rod Johnson,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历...
2020-04-27 16:42:13
621
1
原创 LeetCode刷题系列——K个一组翻转链表
题目描述思路(看图看代码)代码package leetcode;/** * @author god-jiang * @date 2020/2/14 11:21 */public class ReverseKGroup { //定义链表 public class ListNode { int val; ListNode next...
2020-04-21 13:42:14
496
1
原创 剑指offer系列——数值的整数次方
题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。输入输出示例1:输入:2.00000 10输出:1024.00000示例2:输入:2.10000 3输出:9.26100示例3:输入:2.00000 -2输出:0.25000解释:2^-2 = 1/...
2020-04-19 18:10:33
430
1
原创 String源码粗略解读
前言基本上只要是Java程序员,就肯定会接触过String类。博主我是大三参加蓝桥杯比赛才学会用String类的charAt(),length(),toString()等等常用函数。所以今天有时间来看看String的源码,分析一下我们常用的方法在源码层面是什么样子的。String类源码中String类是用final关键字修饰的,表示String类是一个不可变的类。然后String类实现...
2020-04-15 15:12:32
507
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人