
Java开发总结
文章平均质量分 73
曹举的个人博客
坚持用更通俗易懂的大白话写技术博文.
展开
-
用大白话讲明白 什么是IO的零拷贝
今天来聊一下什么是IO的零拷贝技术?按照我的理解来说的话,零拷贝其实就是首先需要明白的一点是,咱们说的零拷贝,说的不是IO过程中数据的拷贝次数是零,而是整个过程中,尽量减少拷贝数据的次数 或者 让CPU拷贝数据的次数为零,但是让CPU拷贝数据的次数为零,并不代表整个过程中数据拷贝次数为零,比如,还需要DMA的数据拷贝。很多中间件里也都用到了零拷贝,比如 kafka 等而且用了零拷贝之后IO的效率确实也提高了很多。那零拷贝为什么能提高IO的效率?原创 2025-03-14 19:35:02 · 736 阅读 · 0 评论 -
用绝对通俗易懂的大白话来说明白 雪花算法SnowFlake
现在很多的服务都是分布式、微服务形式的,而且大数据量也可能导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表中会生成重复的 id 值。那么如何保证水平分表后的多张表中的 id 是全局唯一性的呢?原创 2024-08-13 15:25:56 · 930 阅读 · 0 评论 -
配置Mysql的慢查询日志
MySQL慢查询日志是MySQL数据库自带的一个功能,用于记录执行时间超过指定阈值的SQL语句,以便于后续的性能优化工作帮助开发和DBA发现哪些SQL语句需要优化,在哪些地方需要修改,以提高数据库的性能默认情况下MySQL数据库是不开启慢查询日志的,long_query_time 的默认值为10(即10秒,通常设置为1秒)原创 2024-08-08 23:12:32 · 1145 阅读 · 0 评论 -
用通俗易懂的大白话聊明白缓存穿透、缓存雪崩、缓存击穿
但如果出现以下这两种特殊情况1. 用户请求的id在缓存中不存在。2. 恶意用户伪造不存在的id发起请求。比如:你数据库里商品只有10000个,你的商品ID只到10000。然后有个人他就猜,这样的用户请求导致的结果是:每次从缓存中都查不到数据,而需要查询数据库,同时数据库中也没有查到该数据,也没法放入缓存。也就是说,每次这个用户请求过来的时候,都要查询一次数据库。图中标红的箭头表示每次走的路线。很显然,缓存根本没起作用,好像被穿透了一样,每次都会去访问数据库。原创 2022-10-08 11:47:44 · 502 阅读 · 0 评论 -
Java项目里解决request流只能获取一次的问题
我们需要写一个自定义包装类,并继承HttpServletRequestWrapper/*** @描述 包装HttpServletRequest* MyServletRequestWrapper + RequestReplaceFilter 的作用是:* 解决异常处理器中拿post请求的json参数时,报request流只能读一次的错* 原因是 request.getReader() 和 request.getInputStream() 都是只能调用一次。原创 2022-09-15 11:56:04 · 3902 阅读 · 0 评论 -
用通俗易懂的大白话搞明白Java里的函数式编程和Lambda表达式
今天,用通俗易懂的大白话来搞明白Java里的函数式编程和Lambda表达式原创 2022-01-22 17:22:34 · 5106 阅读 · 5 评论 -
Java项目中利用钉钉机器人Webhook向钉钉群推送告警通知
今天来讲一下 Java项目中利用钉钉机器人Webhook向钉钉群推送告警通知一、配置钉钉群1、新建一个接收通知的钉钉群如下图,创建一个接收通知的钉钉群选择项目群,点创建输入群名称,右侧选择群成员,最后点击右下角的创建2、对群进行设置点群右上角的设置按钮点击 “智能群助手”点 “添加机器人”点 添加机器人 最右边的 “+” 加号选最后的 自定义 通过Webhook接入自定义服务点 添加输入机...原创 2022-01-15 10:25:40 · 4262 阅读 · 4 评论 -
IDEA反编译字节码插件---jclasslib bytecode viewer
1、安装File --> Settings打开设置界面,选择Plugins,在搜索框内输入jclasslib,点击下边搜索点右边的 Install安装完成后,重启Idea2、使用接下来,看一下怎么使用想反编译class字节码文件,首先得需要有class字节码文件,所以,得先把项目里的java文件编译成class字节码首先点idea上方的 Build-->Build Project接着打开你想反编译字节码文件的java类然后点Idea上方的 V.原创 2022-01-14 16:47:09 · 4198 阅读 · 1 评论 -
SpringBoot项目中使用p6spy实现打印拼接好的sql语句
现在很多Java项目都是用的mybatis对数据库进行操作在开发调试的过程中,SpringBoot项目可以通过配置,把mybatis的sql打印出来,但是配置完成后,打印出来的sql是预编译的sql,而不是拼接完成的sql,就是那种带问号的sql,然后问号具体的值是在下一行的Parameters里打印出来的,每次看sql的时候,还需要自己复制出来,然后手动把问号替换掉,这样就很不方便,是不是有点烦。所以,今天就给大家介绍一个非常好用的工具,来解决上边的问题这个工具就是p6spy,好,下面就是开始原创 2022-01-14 11:33:57 · 1165 阅读 · 0 评论 -
大白话讲清楚JVM里的方法区、永久代以及元空间
在JDK1.8和以后版本中JVM的运行时数据区的结构慢慢发生了变化其中最大的变化就是关于方法区的,比如去除了永久代,并把StringTable 串儿池移入了堆内存,等等。今天就用通俗易懂的大白话讲清楚JVM里的方法区1、搞清楚方法区、永久代以及元空间之间的关系首先,我们看一下JVM运行时数据区的结构图从上图可以看出,JVM的规范中,是把整个运行时数据区,分为了:堆、栈、方法区、程序计数器和本地方法栈。接下来,我们先来理解两个概念:规范和实现针对Java虚拟机的实现有专门原创 2022-01-08 14:52:20 · 4529 阅读 · 4 评论 -
mysql索引在哪些情况下会失效?
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:1、如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引2、like查询是以%开头,则会导致索引失效。但是以%结束,不会导致索引失效,例如 name like ‘张%’,这种情况索引不会失效。3、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。4、在MYSQL使用不等于(<>..原创 2021-09-03 10:56:12 · 3023 阅读 · 2 评论 -
大白话聊一聊mysql分组中的GROUP_CONCAT使用
上一篇讲完了对 group by的理解,用通俗易懂的大白话解释清楚group by这篇讲一下,GROUP_CONCAT的使用表结构与数据如下select * from student;1、现在的需求就是每个id为一行 在前台每行显示该id所有分数怎么办呢?就可以使用分组中的 group_concatselect id,GROUP_CONCAT(score) from student group by id;可以看到 根据id 分成了三行,并且分数默认用 逗号 分割,.原创 2021-08-28 16:40:18 · 550 阅读 · 0 评论 -
RabbitMQ消息的可靠性投递
今天来说一下RabbitMQ的消息可靠性投递,先看一下图从图上可以看到从发送消息到消息最后的消费的链路是:生产者把消息发送到Brocker(Brocker把消息给对应的交换机),交换机把消息投递给对应的队列,消费者监听对应的队列进行消费所以消息的可靠投递分为了两大内容:发送端的确认(也就是p到b和e到q)和消费端的确认(也就是q到c)一、发送端确认发送端的确认又分为了消息到达Brocker的确认和消息到达队列的确认1、消息到达Brocker的确认当消息安全抵达Brocker后,.原创 2021-08-24 17:45:02 · 567 阅读 · 0 评论 -
Java中各个ArrayList、HashSet、TreeSet等容器的一些理解以及判断元素唯一性的条件
为了满足不同的需求,Java里有好多种容器,就好比现实中有好多容器一样,水杯啊,碗啊,都能装东西,只是使用场景不一样,为了满足不同的使用场景,Java里出现了很多容器。因为是各自为了满足不同场景,所以他们底层的数据结构的实现也不同。因为各种容器底层数据结构不一样,所以它们保证元素唯一性的判断依据也是不同的ArrayList判断元素的唯一性和删除元素依赖于equals方法HashSet判断元素的唯一性和删除元素是依赖hashCode方法和equals方法,它是先调用hashCode方法判断元素的哈希原创 2021-06-19 17:47:09 · 477 阅读 · 0 评论 -
Java中CompletableFuture多线程任务异步编排
今天来简单看一下CompletableFuture多线程任务异步编排为什么需要CompletableFuture?当多线程任务出现了相互依赖,需要按照一定的顺序执行的时候就需要用到CompletableFuture多线程任务异步编排按照我的理解:CompletableFuture可以分为一下几种情况1、单任务2、两任务的编排3、三任务的编排4、多任务的编排...原创 2021-05-28 14:51:20 · 3707 阅读 · 3 评论 -
为什么HashMap的长度一定是2的次幂?
HashMap是面试过程中最常问的知识点之一今天用最通俗易懂的大白话来讲一讲:为什么HashMap的长度一定是2的次幂?大家知道HashMap中,如果想存入数据,首先它需要根据key的哈希值去定位落入哪个桶中它的做法是,三步:>>>无符号右移、^异或、&与具体是:拿着key的哈希值,先无符号右移16位,然后异或上key的哈希值,得到一个值,再拿着这个值去与上数组长度减一最后得出一个数,如果数组长度是15的话,这个数是一个0-15之间的一个数,这个数就是得出的数组原创 2021-04-30 10:01:05 · 7484 阅读 · 15 评论 -
用绝对通俗易懂的大白话解释清楚sql中的group by
今天,用绝对通俗易懂的大白话,来搞懂sql中的group by原创 2022-01-24 09:50:54 · 7864 阅读 · 3 评论 -
大白话聊懂Java中的连接池,用包装模式实现标准的DataSource数据源连接池
铁子们,快扫码关注啦!或 wx搜索:“聊5毛钱的java”,关注可领取博主的Java学习视频+资料,保证都是干货一、首先简单谈谈为什么要用连接池?大家知道,我们平常连接数据库的时候,首先需要获取到数据库的连接,在Java中对应的是 Connection,建立获取数据库连接是比较消耗资源的,而且每次建立获取连接也比较浪费时间,可以试想,如果每次请求过来,需要访问数据库时,都去重新建立并获取新的连接,会浪费大量的资源和时间,此时客户端的响应时间肯定会较长,这并不是我们想看到的。因此这时候我们就要想办..原创 2021-04-03 10:37:04 · 2102 阅读 · 0 评论 -
联合索引最左前缀规则,经典的c1,c2,c3,c4联合索引题分析
很经典的一个联合索引的题:假设某个表有一个联合索引(c1,c2,c3,c4)以下只能使用该联合索引的c1,c2,c3部分A where c1=x and c2=x and c4>x and c3=xB where c1=x and c2=x and c4=x order by c3C where c1=x and c4= x group by c3,c2D where c1=? and c5=? order by c2,c3E where c1=? and c2=? and c原创 2021-03-23 10:52:07 · 4085 阅读 · 4 评论 -
解决Navicat 连接 Mysql 8 出现1251- Client does not support authentication protocol 错误
在电脑上安装了Mysql 8,安装完成后用Navicat 去连接,发现报错了原因是:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password解决问题方法:把mysql用户登录密码加密规则还原成mysql_native_password.具体操作步骤如下:1.cmd打开命令行,进入MySQL的bin目录,输入mysql -u root -p,输入密码2、输入以下命令#更新一下用户的密.原创 2021-01-23 11:10:18 · 440 阅读 · 0 评论 -
mybatis-plus常用的QueryWrapper条件参数
setSqlSelect 设置 SELECT 查询字段 where WHERE 语句,拼接 + WHERE 条件 and AND 语句,拼接 + AND 字段=值 andNew AND 语句,拼接 + AND (字段=值) or OR 语句,拼接 + OR 字段=值 orNew OR 语句,拼接 + OR (字段=值) eq 等于= allEq 基于 map 内容等于= ne 不等于<> gt 大于&原创 2021-01-18 11:50:35 · 3535 阅读 · 0 评论 -
使用Docker快速安装部署ES和Kibana并配置IK中文分词器以及自定义分词拓展词库
使用Docker快速安装部署ES和Kibana的前提:首先需要确保已经安装了Docker环境如果没有安装Docker的话,可以参考上一篇的内容:Linux上安装Docker有了Docker环境后,就可以使用Docker安装部署ES和Kibana了一、安装部署ES和Kibana1、下载ealastic search和kibana(es的可视化管理页面)docker pull elasticsearch:7.6.2docker pull kibana:7.6.22、配置mkdi原创 2020-10-28 23:18:37 · 2699 阅读 · 0 评论 -
使用Docker快速安装部署redis
使用Docker快速安装部署nginx的前提:首先需要确保已经安装了Docker环境如果没有安装Docker的话,可以参考上一篇的内容:Linux上安装Docker有了Docker环境后,就可以使用Docker安装部署redis了1、拉取镜像docker pull redis如果遇到pull拉取很慢的情况,可以使用阿里云镜像加速器完美解决[root@localhost ~]# cd /etc/docker[root@localhost ~]# vi /etc/docker/d原创 2020-10-28 21:56:10 · 519 阅读 · 0 评论 -
使用Docker快速安装部署mysql
使用Docker快速安装部署nginx的前提:首先需要确保已经安装了Docker环境如果没有安装Docker的话,可以参考上一篇的内容:Linux上安装Docker有了Docker环境后,就可以使用Docker安装部署mysql了1、拉取镜像docker pull mysql:5.7如果遇到pull拉取很慢的情况,可以使用阿里云镜像加速器完美解决[root@localhost ~]# cd /etc/docker[root@localhost ~]# vi /etc/docke原创 2020-10-28 21:37:13 · 425 阅读 · 0 评论 -
使用Docker快速安装部署RabbitMQ
1、拉取镜像,安装运行运行以下命令docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management运行完命令后耐心等待一两分钟,它就会自动开始拉取镜像,并启动一个容器出现下图界面说明rabbitmq容器就启动成功了2、设置rabbitmq随docker自动启动docker up原创 2020-10-27 20:36:42 · 500 阅读 · 0 评论 -
使用Docker快速安装部署nginx
1、随便启动一个nginx实例,只是为了复制出配置docker run -p80:80 --name nginx -d nginx:1.102、将容器内的配置文件拷贝到/mydata/nginx/conf/ 下#先创建本地所需要的三个文件夹mkdir -p /mydata/nginx/htmlmkdir -p /mydata/nginx/logsmkdir -p /mydata/nginx/conf#执行以下命令把容器内的配置文件拷贝到本地的/mydata/nginx/conf/原创 2020-10-20 15:35:01 · 483 阅读 · 0 评论 -
VirtualBox+Vagrant快速搭建虚拟机
之前我们创建虚拟机更多的可能是用VMware,使用VMware我们也可以利用它的克隆等快捷的方式来创建出我们需要的虚拟机但是感觉过程还是有点繁琐,所以今天用VirtualBox+Vagrant 来更快更方便的搭建虚拟机首先需要安装VirtualBox和Vagrant百度云下载地址:下载地址:https://pan.baidu.com/s/1D245z1ofzfOpKe0wysMdPw提取码:g8ni下载完正常安装就可以了。安装好后,打开VirtualBox,最好配置一下虚拟机文件存储..原创 2020-10-16 19:36:03 · 604 阅读 · 0 评论 -
Linux上安装Docker,并解决速度太慢---使用国内阿里云镜像加速安装
https://docs.docker.com/engine/install/centos/这是Docker官方给的安装教程地址看完后,总结出以下几步:1、卸载旧版本sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-lates...原创 2020-07-19 18:32:01 · 5117 阅读 · 2 评论 -
使用Charles修改请求和响应数据
使用Charles可以修改请求和响应的数据最后一步,在下面圈红的那个Value里输入你想返回指定的json值,点击ok就好了配置完后,再去手机app上请求一下,发现手机端看到的数据已经是你更改过的数据了修改请求参数和上边的响应参数步骤差不多,最后勾选的时候选择Request就好了...原创 2020-07-14 17:44:35 · 2444 阅读 · 0 评论 -
解决SpringBoot文件上传异常提示The temporary upload location xxx is not valid
在用SpringBoot搭建的服务时,如果你用到了文件上传类型的接口的话,可能会遇到今天说的这个坑:之前部署到服务器上的SpringBoot应用一直工作得好好的,而且上传文件的接口之前也一直好好的,都没问题;但是有一天突然发现调用上传文件的接口失败,出现了类似以下的提示The temporary upload location [/tmp/tomcat.4232587034585098924.8083/work/Tomcat/localhost/ROOT] is not valid具体如下:原创 2020-06-23 18:18:27 · 6290 阅读 · 13 评论 -
Java实现传入经纬度计算两点之间距离
在日常的开发中,可能会遇到这种需求:从数据库里查出商家店铺的位置后,需要根据APP端传来用户的位置经纬度来计算每个店铺距离用户当前位置的距离。后台用Java实现起来很简单1、导入依赖的jar<!--计算距离依赖的jar--><dependency> <groupId>org.gavaghan</groupId> <artifactId>geodesy</artifactId> <version>1.1.原创 2020-06-10 15:31:17 · 2161 阅读 · 0 评论 -
用最直接的大白话来聊一聊Java对象的GC垃圾回收以及Java对象在内存中的那些事
前言:今天闲来无事,有空闲的时间,所以想坐下来聊一聊Java的GC以及Java对象在内存中的分配。和标题一样,本篇绝对是用最直接最通俗易懂的大白话来聊文章中基本不会有听起来很高大上专业术语,也不会有太多概念性的描述,本着一看就懂的原则来写。因为之前看很多文章都是概念性的东西太多,让人越看越迷糊,越看越觉得有距离感,不接地气。看完之后甚至会觉得自己完蛋了,自己也就这样了,没救了,好多东西怎么学都学不会,感觉自己就是不如别人;我最不希望的就是这个,所以我写东西尽量都是用最通俗易懂,最接地气的大白原创 2020-06-06 11:44:29 · 9616 阅读 · 57 评论 -
Java代码实现按照距离、评分、订单数排序
从数据查询出来数据集合后,可能不是我们想要的排序顺序,所以需要我们在内存中进行排序下面是用 Collections.sort()写的一个例子import java.util.*;public class Test { public static void main(String[] args) { List<Map<String,Object>> list = new ArrayList<>(); Map<St原创 2020-05-29 18:28:52 · 1703 阅读 · 0 评论 -
Java导出Excel完整例子+完整代码,使用easypoi导出Excel+通用工具类
前言:在之前写Excel导入导出功能的时候,使用更多的可能是apache的poi,相信用过poi的应该都会感觉poi使用起来还是有点点麻烦的,所以,如果你是:不太熟悉poi的、不想写太多重复太多的、只是简单的导入导出的。那么相信我,使用easypoi绝对很适合。easypoi,正如同它的名字一样,主打的功能就是容易,让一个没见接触过poi的人员,就可以很方便的写出Excel导出、Excel导入,通过简单的注解就可以完成以前复杂的写法。so,今天就用easypoi来做一个导出Excel的完整案例,原创 2020-05-13 10:16:14 · 3882 阅读 · 2 评论 -
easypoi或者POI导出Excel时 IndexedColors 编码枚举值 与 颜色 对照
<table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td class="xl28" style="background-color: #333333;" width="45" height="18">color</td><td class="xl29" width="45">org.apache.poi.hssf.util.HSSFColor$GREY_80原创 2020-05-12 16:27:08 · 4009 阅读 · 0 评论 -
idea 注入mapper报错报红的几种解决方案
相信大家在使用idea的时候一定会遇到这样的问题,就是在service里注入mapper的时候,明明代码没有问题,也可以运行,但是idea它就是给你报个错,有个红色的波浪线在下面,这让人感觉很不舒服。怎么办呢?先来大概说一下,产生这种现象的原因。idea其实是非常智能的,它可以理解Spring的上下文,然鹅XxxxMapper 这种接口是Mybatis的,IDEA它理解不了。再加上 @Aut...原创 2020-05-07 15:39:04 · 25926 阅读 · 2 评论 -
mysql修改create_time默认时间为当前时间和update_time更新时间为当前修改更新的时间
mysql数据库里咱们一般都会给表里加上create_time和update_time这两个字段如果每次插入数据或者更新修改数据都需要在代码里或者sql里加上create_time和update_time的话,就有点繁琐可以用下面的ALTER语句来修改create_time默认为当前时间、update_time更新时间为当前修改更新的时间ALTER TABLE `user`MODI...原创 2020-05-07 11:56:25 · 9166 阅读 · 0 评论 -
Springboot配置mybatis打印sql日志
Springboot配置mybatis打印sql日志,超级简单只需要在application.yml配置文件中加上以下几行内容就OK了# 配置slq打印日志mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl...原创 2020-04-24 11:38:36 · 3946 阅读 · 1 评论 -
Springboot配置捕捉validate校验参数异常统一处理并自定义validate校验返回格式
一、自定义修改validate校验返回格式@Valid,@NotBlank,@NotNull是比较常用的参数校验注解但是validate参数校验失败后,返回的json数据可能并不是咱们最终想要的,下图就是校验失败后它默认返回的数据一般情况下,咱们可能只需要图中标红的那个提示信息就OK了那怎么改它的返回数据呢?只要添加一个配置类就行了/** * validate校验...原创 2020-04-24 11:32:27 · 15062 阅读 · 3 评论 -
idea设置鼠标放到方法上查看参数和注释
点击File-Setting或者ctrl + alt + s打开设置界面,进入对应的设置界面,然后把下图标注的两个地方勾选上,就OK了设置好以后,鼠标放到方法上,看下效果可以看到,鼠标放上去就可以很清晰的看到方法的参数和注释了...原创 2020-04-24 09:16:04 · 2989 阅读 · 0 评论