
笔记
文章平均质量分 74
曹举的个人博客
坚持用更通俗易懂的大白话写技术博文.
展开
-
用大白话讲明白 什么是IO的零拷贝
今天来聊一下什么是IO的零拷贝技术?按照我的理解来说的话,零拷贝其实就是首先需要明白的一点是,咱们说的零拷贝,说的不是IO过程中数据的拷贝次数是零,而是整个过程中,尽量减少拷贝数据的次数 或者 让CPU拷贝数据的次数为零,但是让CPU拷贝数据的次数为零,并不代表整个过程中数据拷贝次数为零,比如,还需要DMA的数据拷贝。很多中间件里也都用到了零拷贝,比如 kafka 等而且用了零拷贝之后IO的效率确实也提高了很多。那零拷贝为什么能提高IO的效率?原创 2025-03-14 19:35:02 · 736 阅读 · 0 评论 -
Java中如何去自定义一个类加载器
官方给的回答是:为 Java 应用程序提供更加灵活和可定制的类加载机制,并实现类的隔离。1、拓展加载源其实JVM除了能加载咱们本地编译好的class文件外,还可以加载其他来源的class文件,比如可以从网络、数据库等地方加载类。2、实现类隔离具体来说就是,自定义类加载器可以实现类隔离,避免类之间的冲突和干扰,这个在tomcat里就有大量的应用。注意:比较两个类是否相等,只有两个类是由同一个类加载器加载的前提下才有意义,否则即使两。原创 2025-03-13 18:03:50 · 922 阅读 · 0 评论 -
mysql的Innodb最大支持的索引长度是多少,以及索引长度怎么计算
如果你用的是utf8mb4,那长度是4n+2;还有就是,如果建表的时候 字段允许是null,需要1个字节记录是否可以为null,如果允许为null,则需要 +1 个字节存储;mysql中普通索引的长度,非常好计算,普通索引的长度就是创建这个字段时,这个字段类型的长度,下面列出了常见的数据类型的长度。上图,可以看到,name是varchar类型的,为了计算方便,我把它的varchar长度给的是100。并且,如下图,我在建表的时候,这个age用的是int类型的,int类型的长度大小是4字节。原创 2025-03-09 18:31:05 · 1064 阅读 · 0 评论 -
用绝对通俗易懂的大白话来说明白 雪花算法SnowFlake
现在很多的服务都是分布式、微服务形式的,而且大数据量也可能导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表中会生成重复的 id 值。那么如何保证水平分表后的多张表中的 id 是全局唯一性的呢?原创 2024-08-13 15:25:56 · 930 阅读 · 0 评论 -
Jenkins配置用户权限
有需要的,可以点开上边的文章进行操作。搭建Jenkins的过程中,它会让你输入创建一个账号(一般都是root),这个账号是拥有所有的操作权限的,但是实际工作中使用Jenkins的时候,不可能让所有人都登录这个超级管理员的账号,肯定是给不同的人分类不同的权限。所以,今天接着来讲一下怎么给Jenkins配置用户权限。原创 2022-10-15 16:47:40 · 9031 阅读 · 0 评论 -
用通俗易懂的大白话聊明白缓存穿透、缓存雪崩、缓存击穿
但如果出现以下这两种特殊情况1. 用户请求的id在缓存中不存在。2. 恶意用户伪造不存在的id发起请求。比如:你数据库里商品只有10000个,你的商品ID只到10000。然后有个人他就猜,这样的用户请求导致的结果是:每次从缓存中都查不到数据,而需要查询数据库,同时数据库中也没有查到该数据,也没法放入缓存。也就是说,每次这个用户请求过来的时候,都要查询一次数据库。图中标红的箭头表示每次走的路线。很显然,缓存根本没起作用,好像被穿透了一样,每次都会去访问数据库。原创 2022-10-08 11:47:44 · 502 阅读 · 0 评论 -
Jenkins使用脚本快速批量删除历史构建记录
大家知道,我们每次使用jenkins拉取代码,进行自动打包部署的时候,它都会在jenkins的工作目录下产生一些文件(包括自动打包生成的jar包,以及其他的一些工作文件),产生的文件中,其中光那个jar包就至少几十兆。你想想,每次部署都至少产生几十兆的文件,那在使用jenkins比较频繁部署项目的时候,或者随着时间越来越久,肯定会占用比较大的磁盘空间;恰巧jenkins默认的工作目录就是在/root目录下,我们平常用的云服务器硬盘一般就40G或50G,那肯定会出现磁盘不够用的情况。原创 2022-09-16 13:30:00 · 4255 阅读 · 1 评论 -
Java项目里解决request流只能获取一次的问题
我们需要写一个自定义包装类,并继承HttpServletRequestWrapper/*** @描述 包装HttpServletRequest* MyServletRequestWrapper + RequestReplaceFilter 的作用是:* 解决异常处理器中拿post请求的json参数时,报request流只能读一次的错* 原因是 request.getReader() 和 request.getInputStream() 都是只能调用一次。原创 2022-09-15 11:56:04 · 3902 阅读 · 0 评论 -
怎么修改Jenkins的默认工作路径,最简单高效的方式
今天来讲一下:怎么修改Jenkins的默认工作路径首先讲一下为什么要修改Jenkins的默认工作路径?大家知道,我们每次使用jenkins拉取代码,进行自动打包部署的时候,它都会在jenkins的工作目录下产生一些文件(包括自动打包生成的jar包,以及其他的一些工作文件),产生的文件中,其中光那个jar包就至少几十兆。你想想,每次部署都至少产生几十兆的文件,那在使用jenkins比较频繁部署项目的时候,或者随着时间越来越久,肯定会占用比较大的磁盘空间;........................原创 2022-08-10 10:01:23 · 6911 阅读 · 0 评论 -
linux怎么看各个目录占用磁盘的大小以及清除没用的文件
有时候使用 df -h 查看一下服务器的硬盘资源占用情况,会发现磁盘已经快被占满了下图就是我的服务器上的情况,可以看到其中的一个磁盘已经快被占满了,占用了86% 那磁盘快被占满了,该怎么找到到底是哪个目录或者哪个文件占用了比较多的空间呢?下面就来简单说一下:首先进入 服务器的根目录输入以下命令:就可以看到,它给你列出来了根目录下的每个目录的占用的大小,如下图 然后,从上边的目录中选择一个占用空间比较大的,cd 进去,进去后,在继续输入刚才的查看占用空间大小的命令:我拿root目录为例,进入ro原创 2022-07-01 14:10:05 · 3826 阅读 · 0 评论 -
给使用docker安装的ES和Kibana设置账号密码
ES安装后,默认是不开启用户名密码验证的,如果你的ES服务是部署在内网的话,不使用账号密码还不会有太大的安全隐患。但是如果,你的ES服务是暴露在外网环境的话,不设置账号密码肯定是非常不安全的,那如何开启简单的用户名密码验证呢?今天来讲一下怎么给使用docker安装的ES和Kibana设置账号密码如果是Docker安装的ES的话,首先需要进入ES容器1、启用认证保存后,退出容器,重启ES2、设置用户密码上一步重启ES容器后,再次进入容器:再次进入容器后,执行以下命令会出现以下画面原创 2022-06-23 16:58:52 · 7748 阅读 · 2 评论 -
用通俗易懂的大白话聊一下AQS和ReentrantLock源码
一、大白话分析流程首先简单聊一下ReentrantLock源码里的一些内容:ReentrantLock它里边有三个内部类:Sync、FairSync、NonFairSyncFairSync、NonFairSync继承Sync,而Sync又继承AQS你new一个ReentrantLock的时候,它默认是给你创建一个非公平锁 NonFairSync但是你也可以通过构造函数传入 true 或 false 来创建公平锁FairSync 或 非公平锁NonFairSync1、先看公平锁new原创 2022-04-16 11:33:18 · 1032 阅读 · 0 评论 -
用大白话从字节码层面来分析一下 a++和++a
可能大家能口算出来,打印出a和b的值分别是11和34,但是最后得出11和34的过程可能和你算的过程不一样今天就从字节码层面来分析一下一、先看下javac反编译出来的字节码内容:分析之前先说一下注意的几个点:1、a++和++a的区别是先执行iload 还是iinc a++是先iload 再iinc;而++a 是先iinc 再iload2、iinc 指令,这个动作是在局部变量的slot槽位上进行的,不是在操作数栈上执行的再说下可能涉及到的几个常见的字节码指令:b......原创 2022-03-30 15:49:33 · 1409 阅读 · 1 评论 -
用最直接的大白话聊一聊,Java中的枚举类你真的理解了吗
思考一下:为什么需要枚举类?枚举类的产生背景是什么?一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,比如成绩Grade只能为A、B、C、D、E其中的一种。类似的问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。1.如何创建枚举类JDK 5新增的 enum 关键字用于定义一个枚举类一个枚举也有构造函数(但是枚举类的构造函数必...原创 2019-05-29 12:07:17 · 2705 阅读 · 11 评论 -
大白话记录String的一些知识以及String里intern的用法
上图结果为trueString s = new String("a") + new String("b");它是先把 "a" "b"放入串池,然后堆中new出2个对象,然后用StringBuffer拼接,最后再new一个对象值是 "ab",赋给s,此时s的值虽然是"ab",但是它是堆里的。接着 s.intern();上图结果为false...原创 2022-03-16 14:31:21 · 1863 阅读 · 0 评论 -
阿里云ECS服务器磁盘挂载---对单独购买的磁盘进行挂载
购买阿里云服务器的时候,会自带一块硬盘,我的是带了40G。然后觉得这40G可能不够用,所以就又单独加钱购买了一块40G的硬盘它自带的那一块硬盘什么都不用做,直接就能用;但是另外一块单独购买的硬盘,需要你配置挂载一下才能使用所以今天就简单讲一下,怎么对阿里云单独购买的磁盘进行挂载一、查看挂载之前的情况1、检查现在磁盘情况使用 df -h 命令来查看一下磁盘情况上图就是我没对单独购买的硬盘进行挂载之前用 df -h 查看的情况可以看到,没挂载之前确实是只显示了一块40G的硬.原创 2022-02-11 09:19:54 · 4826 阅读 · 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 评论 -
jenkins配置拉取git远程仓库的代码并进行自动化构建部署
上篇讲了 在linux上搭建jenkins,并进行所需的配置现在继续讲一下,jenkins怎么配置拉取gitlab仓库的代码并进行自动化构建部署按照上一篇的操作,安装好jenkins并配置好对应的jdk,maven,还有通信的私钥后,就可以进行接下来的操作了第一种情况:使用jenkins构建发布项目到安装jenkins服务的本机器上1、新建任务2、对新建的任务进行配置最后点保存把执行的shell命令贴一下#!/bin/bashs...原创 2021-10-09 11:21:54 · 4781 阅读 · 0 评论 -
在linux中设置nexus开机自启动
本篇讲一下在linux中设置nexus开机自启动关于 在linux中安装nexus可以看下我之前写的另外一篇文章:在linux上搭建maven私服nexus和nexus的使用一、把nexus配置成服务1、新建服务脚本vim /etc/init.d/nexus添加以下脚本内容#!/bin/bash#chkconfig:2345 20 90#description:nexus#processname:nexusexport JAVA_HOME=/usr/local/jd原创 2021-09-30 23:02:30 · 7317 阅读 · 2 评论 -
在linux中设置tomcat开机自启动
一、把tomcat配置成服务新建服务脚本vim /etc/init.d/tomcat添加一下脚本内容#!/bin/bash# description: Tomcat7 Start Stop Restart# processname: tomcat7# chkconfig: 234 20 80CATALINA_HOME=/usr/local/apache-tomcat-9.0.8case $1 in start) sh $CAT原创 2021-09-30 22:39:54 · 2396 阅读 · 0 评论 -
用最简单的方式把本地idea里的项目推送到gitlab或github或码云gitee上
1、本地安装git要把本地idea里创建的项目,推送到远端的git上,首先本地需要安装并配置好git关于本地安装配置git,可以看我之前写的文章:git的安装和初始化配置 生成SSH key 并配置github/gitlab的SSH key2、在gitee或者gitlab或者github里创建对应项目的仓库在码云gitee、gitlab、github里创建项目仓库的步骤都差不多,下面以码云gitee为例:首先打开:https://gitee.com/登录进去,点右上角的 + 加号,然后.原创 2021-09-29 20:39:31 · 3614 阅读 · 0 评论 -
Jenkins安装插件一直失败,报错SunCertPathBuilderException的解决方案
Jenkins(2020年及以后版本,2.260以上)安装后,插件下载时失败网上找了各种解决方法,修改jenkins插件的下载源地址:找到菜单Manage Jenkins → Manage Plugins → Advanced → Update Site,把URL改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json或把默认地址https://updates.jenkins.io/update-cente原创 2021-09-26 22:24:35 · 2944 阅读 · 1 评论 -
在linux上搭建jenkins,并进行所需的配置
今天来讲一下 在linux上搭建jenkins一、前置条件在linux上安装jenkins的前提条件是已经安装了JDK和Tomcat1、jdk的安装配置关于jdk的安装配置,可以看我之前写的一篇博客:linux的基本环境配置JDK2、配置tomcat第一步:下载tomcat的压缩包第二步:将下载的压缩包上传到linux上我是放在了 /root./下第三步:解压缩#将tomcat解压到 /usr/local/ 目录下tar -zxvf apache-tomcat-.原创 2021-09-26 21:10:53 · 6497 阅读 · 1 评论 -
在linux上搭建maven私服nexus和nexus的使用
今天来讲一下 在linux上搭建maven私服nexus和nexus的使用一、nexus的安装1、下载nexus2、上传并解压我是上传到了 /root/目录下解压#解压tar -zxvf nexus-3.12.1-01-unix.tar.gz -C /usr/local/3、修改默认端口nexus默认使用的是8081端口,如果不想使用默认的8081端口的话,可以使用以下的命令进行修改vim /usr/local/nexus-3.12.1-01/etc/nex.原创 2021-09-26 16:16:27 · 3915 阅读 · 1 评论 -
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项目传到linux上进行Docker打镜像
很多同学想给自己本地的项目打Docker镜像,但是本地是window的环境,而且很多电脑装window环境的同学都觉得在window环境下安装Docker很麻烦,确实是这样因为Docker本身就是对linux的环境比较友好,在win下配置还是比较麻烦的所以今天就写一下怎么把本地的项目传到linux机器上进行Docker打包想在linux环境给你的项目打Docker镜像,前提是你的linux机器得配置和jdk环境和maven环境如果没配置的可以看一下这两篇文章:linux上配置maven环原创 2021-08-14 17:09:37 · 657 阅读 · 0 评论 -
linux上配置maven环境
一、下载maven压缩包链接:https://pan.baidu.com/s/1VIe-fgx-q0CTUWJI96_toA提取码:1234二、上传并解压下载完压缩包后,将压缩包上传到linux我是放在了 /usr/local/执行加压命令:tar -zxvf apache-maven-3.6.1三、配置环境变量vim /etc/profile把以下的配置复制粘贴到最下边export MAVEN_HOME=/usr/local/apache-maven-3.6.1..原创 2021-08-14 16:21:16 · 1007 阅读 · 0 评论 -
使用Docker安装nacos,并配置将nacos的信息持久化到mysql
铁子们,快扫码关注啦!或 wx搜索:“聊5毛钱的java”,关注可领取博主的Java学习视频+资料,保证都是干货一、配置数据库的信息首先创建一个数据库:我创建的数据库名字叫 my_nacos然后执行对应的建表sql,建表sql我放在了百度云盘,链接:https://pan.baidu.com/s/1lkteB_JmNCscyolTw6seJQ提取码:1234执行完建表语句后,会有下面这些表然后执行下面的语句添加一个登录nacos管理端的账号,账号:nacos,密码:naco...原创 2021-08-14 14:31:09 · 488 阅读 · 0 评论 -
Java中各个ArrayList、HashSet、TreeSet等容器的一些理解以及判断元素唯一性的条件
为了满足不同的需求,Java里有好多种容器,就好比现实中有好多容器一样,水杯啊,碗啊,都能装东西,只是使用场景不一样,为了满足不同的使用场景,Java里出现了很多容器。因为是各自为了满足不同场景,所以他们底层的数据结构的实现也不同。因为各种容器底层数据结构不一样,所以它们保证元素唯一性的判断依据也是不同的ArrayList判断元素的唯一性和删除元素依赖于equals方法HashSet判断元素的唯一性和删除元素是依赖hashCode方法和equals方法,它是先调用hashCode方法判断元素的哈希原创 2021-06-19 17:47:09 · 477 阅读 · 0 评论 -
平常一些小的tips
1、TypeReference json转任意对象:Map<String, List<Catelog2Vo>> result = JSON.parseObject(cateLogJson, new TypeReference<Map<String, List<Catelog2Vo>>>(){});2、queryWrapper.and() 拼接and查询条件:queryWrapper.eq("province",provi.....原创 2021-06-01 16:13:21 · 879 阅读 · 0 评论 -
为什么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 评论 -
mysql中使用select sum查询结果为NULL的解决办法---IFNULL应用
再mysql中,统计数据的时候使用sum(column)计算,发现如果统计的这一列的所有数据都为0的话,select sum(column)的结果会是“NULL”当NULL与其它数据进行计算的时候会有错,或者使用int来接收也会报错。所以需要处理一下解决办法:IFNULL(SUM(column),0),当数据库不存在任何符合求和记录时,sum返回0...原创 2021-04-20 11:46:30 · 2253 阅读 · 0 评论 -
大白话聊懂Java中的连接池,用包装模式实现标准的DataSource数据源连接池
铁子们,快扫码关注啦!或 wx搜索:“聊5毛钱的java”,关注可领取博主的Java学习视频+资料,保证都是干货一、首先简单谈谈为什么要用连接池?大家知道,我们平常连接数据库的时候,首先需要获取到数据库的连接,在Java中对应的是 Connection,建立获取数据库连接是比较消耗资源的,而且每次建立获取连接也比较浪费时间,可以试想,如果每次请求过来,需要访问数据库时,都去重新建立并获取新的连接,会浪费大量的资源和时间,此时客户端的响应时间肯定会较长,这并不是我们想看到的。因此这时候我们就要想办..原创 2021-04-03 10:37:04 · 2102 阅读 · 0 评论