自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 解决Property ‘mapperLocations‘ was not specified or no matching resources found问题

Property ‘mapperLocations‘ was not specified or no matching resources found

2022-06-01 23:07:10 2180

原创 【大厂面试】智力题怎么破?

烧绳子 燃烧一根不均匀的绳子需要一小时,怎么做才能问如何度量出半个小时,45分钟,75分钟? 思路: https://blog.csdn.net/ma950924/article/details/106494399 想解出烧绳子的问题,有两个关键度量时间点30分钟和15分钟: 度量半个小时 第一个问题度量半个小时时最简单的,绳子虽然是不均匀的,但是一根绳子完整烧完所用的时间是固定的。从两端烧绳子,等绳子全部烧完所用的时间就是半个小时。 度量15分钟 已经可以度量出半个小时与一个小时了,所以想要度量出45分

2022-01-12 21:32:40 783

原创 【大厂面试】TCP/UDP还可以这样问?

TCP TCP的accept发生在三次握手的哪个阶段? 如下图connect和accept的关系: accept过程发生在三次握手之后,三次握手完成后,客户端和服务器就建立了tcp连接并可以进行数据交互了。 这时可以调用accept函数获得此连接。 connect返回了可以认为连接成功了吗? connect返回成功后,三次握手就已经完成了。 已完成的链接会被放入一个队列中,accept的作用就是从已连接队列中取出优先级最高的一个链接,并将它绑定给一个新的fd,服务端就可以通过这个新的fd来recv和sen

2021-09-12 21:12:33 360

原创 TCP三次握手,终于弄懂了

TCP三次握手的过程 客户端向服务端发起一个SYN的包,服务端返回对应的SYN的ACK响应以及新的SYN包,然后客户端返回对应的ACK。 其中: SYN(synchronous)同步序列编号 ACK(acknowledgement)确认字符 详细见思维导图: 使用的队列 半连接队列(syn队列)和全连接队列(accept队列) 服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,接着客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接

2021-06-09 16:48:07 522 2

原创 Spring、Spring MVC、Spring Boot 和 Spring Cloud的联系与区别

Spring 和 Spring MVC: spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc)、业务层(Ioc)、持久层(jdbcTemplate)等都提供了多种配置解决方案; springMvc是spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于spring框架中WEB层开发的一部分; Spring MVC 和 Spring Boot: springMvc属于一个企业WE

2021-04-14 08:50:43 930

原创 CPU100%问题如何快速定位

三个步骤: 1. 找到最耗CPU的进程 工具: top 方法: 执行 top -c ,显示进程运行信息列表 键入 P (大写 p),进程按照 CPU 使用率排序 2. 找到最耗CPU的线程 工具: top 方法: top -Hp 10765 ,显示一个进程的线程运行信息列表 键入 P (大写 p),线程按照 CPU 使用率排序 3. 查看堆栈,定位线程在干嘛,定位对应代码 首先,将线程 PID 转化为 16 进制。 工具:printf 方法:printf “%x\n” 10804 之所以要转化为 1

2021-04-02 23:37:32 712 1

原创 MySQL中order by的实现原理

分为两种,全字段排序和rowid排序。 全字段排序 MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。 语句的执行流程: 初始化sort_buffer,确定放入select的字段 找到满足条件的行取出select的字段存入sort_buffer中 一直查找到不满足条件的为止 对sort_buffer中的数据按照排序的字段做排序 sort_buffer_size可以设置sort_buffer的大小。 如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。 但如

2021-03-21 09:24:56 638

原创 Java ThreadPoolExecutor 线程池总结

介绍 线程池就是管理线程的池子,当有任务要处理时,不用频繁创建新线程,而是从池子拿个线程来处理。 当任务执行完,线程并不会销毁,而是在等待下一个任务。 因此可以节省资源,提高响应速度。 还可以提高线程的可管理性。 execute()提交任务执行逻辑 当有任务提交的时候,首先判断核心线程池是否已满,如果未满,创建核心线程执行任务,如果满了将任务添加到队列中,如果队列也满了,判断线程池是否已满,如果未满,创建非核心线程执行任务,如果已满,执行饱和策略。 线程池的参数 7个参数: 饱和策略 线程池的饱和策略主

2021-03-15 09:34:28 1148 1

原创 MySQL中group by的实现原理

在MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。 GroupBy会默认按照分组的字段进行排序;如果不需要排序,可使用order by null 使用松散(Loose)索引扫描实现 GROUP BY MySQL 完全利用索引扫描来实现GROUP BY ,并不需要扫描所有满足条件的索引键即可完成操作得出结果。 Extra信息中显示:Using index for group-by 要利用到松散

2021-03-06 15:44:48 2036 1

原创 面试官:为什么堆排序里建堆的时间复杂度是O(n)?

参考 https://blog.csdn.net/YuZhiHui_No1/article/details/44258297

2021-03-03 10:10:13 1015 3

原创 短网址系统的设计与实现

短网址介绍 想必大家也经常收到垃圾短信吧…短信中的链接一般都是短链接,类似于下图这样: 为什么这里面的URL都是短的呢?有什么好处呢?怎么做到的呢? 短URL的好处 短信和许多平台(微博)有字数限制 ,太长的链接加进去都没有办法写正文了. 好看。 比起一大堆不知所以的参数,短链接更加简洁友好. 方便做一些统计。 你点了链接会有人记录然后分析的. 安全。 不暴露访问参数. 这就是为什么我们现在收到的垃圾短信大多数都是短URL的原因了. 短URL基础原理 短URL从生成到使用分为以下几步

2021-02-26 11:32:26 985

原创 Spring定时任务@Scheduled注解使用方式

使用 使用@Scheduled cron表达式标注任务方法 @Component public class testTask { private Logger logger = LoggerFactory.getLogger(testTask.class); @Scheduled(cron = "0/5 * * * * ?") public void doTask() { logger.info(Thread.currentThread().getName()+"=

2021-02-26 11:28:10 892

原创 手撕Java-BIO-NIO

介绍 最近学习了NIO,顺便复习了一下BIO,分别手写了阻塞和非阻塞的server和client端。 Java BIO Server public class BIOServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(18686); Socket socket = serverSocket.a

2021-02-26 11:24:32 448 1

原创 一篇看懂ConcurrentHashMap中put方法的逻辑

ConcurrentHashMap的put方法 源码及注释如下: public V put(K key, V value) { return putVal(key, value, false); } final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); // hash

2021-02-26 11:23:21 1037

原创 一篇看懂HashMap中put方法的逻辑

HashMap的put方法 下面来看一下put方法的源码(详细注释): public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] t

2021-02-26 11:22:33 1706 3

原创 get和post的区别

总体来说: http报文层面:get将请求信息放在url,post放在报文体中 数据库层面:get符合幂等性和安全性,post不符合 其他层面:get可以被缓存被储存,而post不行 详细:

2021-02-25 15:13:34 595 1

原创 Java异常处理的十条建议

前言 Java异常处理的十个建议,希望对大家有帮助~ 一、尽量不要使用e.printStackTrace(),而是使用log打印。 反例: try{ // do what you want }catch(Exception e){ e.printStackTrace(); } 正例: try{ // do what you want }catch(Exception e){ log.info("你的程序有异常啦,{}",e); } 理由: printStackTrace()打

2021-02-25 10:43:13 1625 12

原创 深入理解Java类的初始化和实例化

介绍 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。 抛砖引玉 下面先来看一个例子吧 先来看父类 Father.java public class Father { private int i = test(); static { Syste

2021-02-25 10:40:12 1011 3

原创 SpringBoot整合Sentry,一篇包会!!

因为公司用到了sentry进行错误日志收集,来进行测试和预发环境的debug,所以自己搭建来进行学习。 Sentry介绍 Sentry是一个实时事件日志记录和聚合平台。它专门用于监视错误和提取执行适当的事后操作所需的所有信息, 而无需使用标准用户反馈循环的任何麻烦。 和其他日志收集的对比 与ELK, splunk不同, sentry专注于应用程序产生的错误日志的聚合和监控. 官方提供了多个语言的SDK. 注意:Sentry不能替代日志收集平台如ELK等,这两个应该是相辅相成的。 Sentry着重于错误监控

2021-02-25 10:39:03 4540

原创 详解Java单例模式

单例模式介绍 概念 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 意图 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2021-02-24 17:58:37 2438 1

原创 分布式事务,这一篇就够了

参考了小米的技术文章,详情可以看文章最下面的链接!! 随着互联网技术的不断发展,系统越来越复杂,几乎所有 IT 公司的系统都已经完成从单体架构到分布式架构的转变,分布式系统几乎无处不在。谈到分布式系统,特别是微服务架构,我们不得不谈分布式事务。今天就跟大家一起聊聊分布式事务以及常用解决方案。 基础理论 在讲解具体方案之前,我们有必要了解一些分布式事务所涉及到的基础理论知识。 事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事

2021-02-24 17:57:20 1190 1

原创 MySQL优化提高笔记

概述 对于mysql的优化是一个综合性的技术,sql的优化只是其中的一种,其中主要包括 表的设计合理化(符合3大范式)。 添加索引(index) [普通索引、主键索引、唯一索引unique、全文索引]。 分表技术(水平分割、垂直分割)。 读写[写: update/delete/add]分离。 合理设计表 在表的设计中一定条件下要满足三范式,表的范式,是首先符合第一范式, 才能满足第二范式 , 进一步满足第三范式。 第一范式: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据

2021-02-24 17:49:47 981

原创 构建Java中间件必备的基础知识

说之前谈两个之前一直有疑问的地方: 反向代理和负载均衡有何区别? 反向代理,是把一些静态资源存储在服务器上,当用户有请求的时候,就直接返回反向代理服务器上的资源给用户,而如果反向代理服务器上没有的资源,就转发给后面的负载均衡服务器,负载均衡服务器再将请求分发给后端的web服务器。 区别就是: 反向代理服务器是需要存储资源的,让用户更快速的接收到资源。 负载均衡就是,为了保证后端web服务器的高可用,高并发,是不需要要存储资源,只需要转发用户的请求。 使用本地缓存的场景 在程序中,有些表数据,数据很少,但是

2021-02-24 14:56:42 1331

原创 SpringBoot整合ELK实现日志收集

ELK简介 ELK是三个开源软件的缩写,分别表示:elasticsearch、logstash、kibana Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。 Kibana也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好

2021-02-24 14:53:31 2777

原创 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较

BigDecimal介绍 BigDecimal,相信对于很多人来说都不陌生,很多人都知道他的用法,这是一种java.math包中提供的一种可以用来进行精确运算的类型。 很多人都知道,在进行金额表示、金额计算等场景,不能使用double、float等类型,而是要使用对精度支持的更好的BigDecimal。 所以,很多支付、电商、金融等业务中,BigDecimal的使用非常频繁。而且不得不说这是一个非常好用的类,其内部自带了很多方法,如加,减,乘,除等运算方法都是可以直接调用的。 除了需要用BigDecim

2021-02-24 14:44:34 1100 1

原创 三句话搞懂Redis-缓存穿透、击穿、雪崩

前言 如何有效的理解并且区分 Redis 穿透、击穿和雪崩之间的区别,一直以来都挺困扰我的。特别是穿透和击穿,过一段时间就稀里糊涂的分不清了。 为了有效的帮助自己,以及拥有同样烦恼的朋友们区分这三种场景。我总结了一些关键词,希望大家可以和我一样通过联想的方式来区分并理解这三种场景的区别! 一. 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了。下面这段逻辑大家用的会比较多:先去 Redis 中查找某资源,Redis 中查不到就去 D

2021-02-24 14:42:20 1843

原创 面试官:数据库索引有什么优点?

引用《高性能MySQL》中的描述:

2021-02-23 19:57:43 980 1

原创 SpringBoot整合分布式任务调度平台XXL-JOB

XXL-JOB简要介绍 XXL-JOB是一个轻量级分布式任务调度平台,其实现原理是:调度中心会配置 cron表达式,路由策略,处理类的bean实例,执行器需要向调度中心发生心跳,对于长时间没有收到心跳的执行器,调度中心会将其剔除 其中在高可用过程中xxl-job-admin是通过xxl_job_qrtz_locks表来竞争数据库锁保证多个调度中心分发任务只分发一次 下面是XXL-JOB的架构图: 搭建admin clone源码并初始化数据库 项目github地址 : https://github.com

2021-02-23 16:46:27 2292

原创 SpringBoot中@Async的用法与实践

介绍 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务。其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法。 @Async的使用 注意事项 必须用在public方法上,且不能是static方法 不能与调用的方法在同一个类中 需要把该方法注入到Spring容器中,就是在一个类中添加异步方法,并在此类上使用@Component之类的注

2021-02-23 16:41:43 5337 2

原创 MySQL中union和union all的原理和区别

引用《高性能MySQL》的原文来说明:

2021-02-23 16:33:23 2280

原创 大白话说SpringBoot自动装配

@SpringBootApplication包括三个注解: @SpringBootConfiguration @ComponentScan @EnableAutoConfiguration 这里最主要的就是@EnableAutoConfiguration : 当使用@EnableAutoConfiguration注解激活自动装配时,实质对应着很多XXXAutoConfiguration类在执行装配工作。 这些XXXAutoConfiguration类是在spring-boot-autoconfigu

2021-02-23 11:52:54 1606

原创 Java使用EasyExcel操作excel

前言 在工作中,使用excel表格处理数据是很常见的操作,本文就来讲解下如何使用开源轮子实现下载、导入、导出的功能。 在之前,很多Java程序员都喜欢使用POI的类库来操作excel,但是非常的不方便,不仅代码写的很臃肿,还要处理各种office版本兼容问题,最怕的就是使用不当很容易造成内存溢出,因此今天给大家推荐阿里的一款开源项目 easyexcel。 项目介绍 easyexcel是一款快速、简单避免OOM的java处理Excel工具 github地址:https://github.com/alibab

2021-02-23 08:50:19 2291 1

原创 ThreadLocal实践与详解

概述 ThreadLocal类是用来提供线程内部的局部变量。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。 ThreadLocal是一个关于创建线程局部变量的类。 通常情况下,我们创建的成员变量都是线程不安全的。因为他可能被多个线程同时修改,此变量对于多个线程之间彼此并不独立,是共享变量。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程无法访问和修改。也就是说:将线程公有化变成线程私有化。 应用和实践 每个线程都需要一个独享的对象(比如

2021-02-23 08:47:52 1411 2

原创 Git版本回退方法

简介 今天在公司犯了错误,在公司公共的develop分支上push了错误的代码,顺便研究了一下git如何回退版本,参考了大佬的做法,记录下了这篇博客。 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回退远程分支版本? 如果提交了一个错误的版本到公共远程分支,又该怎么回退版本? 本地分支版本回退的方法 如果你在本地做了错误提交,那么回退版本的方法很简单 先用下面命令找到要回退的版本的commit id: git reflog 接着回退版本: git reset

2021-02-23 08:45:14 1510

原创 Java编写单词小游戏

介绍 公司最近有一个竞技场项目,里面有一个单词小游戏。 游戏大概就是随机生成一个5*5的棋盘,上面有单词的字母,通过滑动连出正确的单词。 棋盘生成算法 思路 首先随机选个一个起点,从这个点开始铺单词。 分别选取上下左右四个方向作为下一个字母的摆放位置,不能触边也不能走重复路,直到平铺完所有的单词。 如果在棋盘能平铺下单词的情况下,找不到路径,就从四个角作为起点,必能找到路径。 代码 import java.util.*; /** * @author Wang Guolong * @version 1

2021-02-22 14:30:55 2544 6

原创 SpringBoot实现通过url下载pdf到本地

最近有需求是点击下载按钮后下载指定url的pdf文件到本地 下面通过SpringBoot来实现一下: 思路就是: 解析url,建立连接获取输入流 copy输入流到输出流中,进行相关设置并返回 @GetMapping("/download") public void download(@RequestParam("url") String urlStr, HttpServletResponse response) throws IOException { URL url = ne

2021-02-22 14:28:37 5065 2

原创 SpringBoot多数据源的动态切换

创建数据库和数据表 首先需要建立两个库进行测试,我这里使用的是master_test和slave_test两个库, 两个库都有一张同样的表,表名tuser 添加依赖 <!-- 添加druid数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter&

2021-02-22 12:03:44 1831 5

原创 Java使用iTextPDF生成PDF文件

iText介绍和说明 因为项目需要生成PDF文件,所以去找了一下能够生成PDF的Java工具,看到了iText可以说好评如潮。 如果你想通过java操作PDF文件,那么 iText 绝对是你的首选。 引入依赖 这里使用的是iText5 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId&

2021-02-22 12:00:45 2036 8

原创 Jackson的使用

介绍 最近公司的竞技场项目中使用了jackson来进行java对象和json的相互转换 下面来介绍一下jackson的简单使用 引入依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>

2021-02-22 11:58:26 1543

原创 IntelliJ-IDEA-高级调试技巧

一、条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值。 参考上图,在断点的位置,右击断点旁边的小红点,会出来一个界面,在Condition这里填入断点条件即可,这样调试时,就会自动停在i=10的位置 二、回到"上一步" 该技巧最适合特别复杂的方法套方法的场景,好不容易跑起来,一不小心手一抖,断点过去了,想回过头看看刚才的变量值,如果不知道该技巧,只能再跑一遍。 参考上图,method1方法调用method2,当前断点的位置j=100,点击上图红色箭头位置的D

2021-02-22 11:56:23 2185

空空如也

空空如也

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

TA关注的人

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