自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java string.split(“,“)方法的坑

(1) 如果limit输入的是一个正数, 那么该模式将最多应用limit - 1次(就是说只会用输入的regex去字符串里面匹配limit-1次),数组的长度将不大于limit,并且数组的最后一个条目将包含最后一个匹配的分隔符之外的所有输入(就是说他分隔的模式是从前逐个往后的).(3) 如果输入limit的值为负数,则模式将被应用尽可能多的次数,数组可以有任何长度。(尾部的空字符串也不会被丢失噢)使用split时如果想按照split(",")截取具体的长度,需要使用split(",",-1)方法。

2023-09-08 09:24:34 418

原创 webFlux框架webClient请求数据报错:Exceeded limit on max bytes to buffer : 262144

WebClient并没有使用项目启动时基于配置创建的类,而是在WebClient.create的时候重新创建类,所以基于配置的方法没用。因为接收响应数据的缓冲区不够大,限制为256k。(AbstractDataBufferDecoder类写死了限制)研究源码,最终发现可以通过WebClient.build时可以修改maxInMemorySize值。我总感觉以上方法不够优雅。决定自己研究解决方案。利用类的加载机制,优先加载项目中的类。利用codecs方法。

2022-10-15 11:00:36 3775 3

原创 java springboot本地调试动态修改nacos配置信息

我想本地项目直接连接测试环境nacos,由于nacos中的配置信息我不能修改,否则测试环境会出问题。但是我还想改配置怎么办呢?可以在本地springboot项目启动拿到nacos配置时修改。例如:测试环境nacos中配置的tomcat临时目录,在我本地无法创建相应的文件夹,导致无法启动项目,所以我就只能换一个目录。nacos配置,如图:无法创建对应目录,如图: 项目启动报错,如图: 1、我们找到NacosPropertySourceBuilder类的loadNacosData方法,把断点打到如图位置 2、使

2022-09-26 12:46:25 6407 8

原创 java中Runnable、Callable、Future、RunnableFuture、CompletionStage接口区别

它只有一个run()函数,该函数没有返回值。二、Callable接口Callable与Runnable的功能大致相似,Callable中有一个call()函数,但是call()函数有返回值Executor(线程池)就是Runnable和Callable的调度容器。Future接口就是对具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果、设置结果等操作。get方法会阻塞,直到任务返回结果是对Runnable和Future继承的一个接口,具有了他们

2022-06-24 11:33:04 990

原创 dubbo原理

dubbo官网:Apache Dubbo 主要包括五个节点:Provider、Consumer、Container、Register、Monitordubbo工作过程:这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。Directory代表多个Invoker,可以把它看成List,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。Cluster将Directory中的多个Invoker伪装成一个Invo

2022-06-24 09:08:55 5378

原创 分布式事务解决方案

分布式理论参考:分布式理论_现实、太残忍的博客-CSDN博客 缺点:一旦事务协调者宕机或者发生网络抖动,会让参与者一直处于锁定资源的状态或者只有一部分参与者提交成功,导致数据的不一致。因此,在⾼并发性能⾄上的场景中,基于 XA 协议的分布式事务并不是最佳选择。所以它比较适⽤于执⾏时间确定的短事务,整体性能比较差。目前主流的数据库基本都支持XA事务,包括MySQL、Oracle、SQL Server、PostgreSQL。 三阶段提交()是二阶段提交()的一种改进版本 ,为解决两阶段提交协议的阻塞问题。 中

2022-06-24 07:42:46 316

原创 zookeeper集群部署

Apache ZooKeeper解压1、zoo1.cfg如下2、zoo2.cfg如下 3、zoo3.cfg如下三、创建dataDir目录mkdir /tmp/zookeeper1mkdir /tmp/zookeeper2mkdir /tmp/zookeeper3echo "1" >/tmp/zookeeper1/myidecho "2" >/tmp/zookeeper2/myidecho "3" >/tmp/zookeeper3/myid./zkServer.sh start ../c

2022-06-23 21:10:50 549

原创 分布式理论

基于集群角度来考虑,如果集群中同步慢,会有多种情况例如:从A节点新增一条数据后,我从B节点必须能够读到此数据,才算满足强一致性。通常使用分布式锁达到强一致性。相当于不需要一致性。通常遇到的都是最终一致性。例如:从A节点新增一条数据后,我从B节点暂时没有读取到,稍后我读取到了,这就算满足了最终一致性。包括mysql中的主从同步。在设计和部署分布式系统时,存在三个明显的需求:CAP理论认为在一个系统中对某个数据不存在一个算法同时满足一致性,可用性,分区容错性。往往需要牺牲某一项来满足其他两项。由于CAP定理限制

2022-06-23 19:58:54 235

原创 zookeeper原理

集群只能有一个leader角色,主要有两个职责:集群可以有多个follower,follower通过心跳和leader保持连接,只要有两个职责:集群可以有多个Observer,Observer主要职责:Observer功能与follower类似,主要区别是Observer无投票权。zk集群想支持更多的客户端并发操作,只能增加更多的follower节点,但是过多follower会使投票阶段变得复杂,选主时间过长,不利于故障快速恢复。所以引入更多Observer节点。zab(zookeeper atomic b

2022-06-23 13:43:48 413

原创 centos7使用mdadm搭建磁盘阵列

1、安装yum -y install mdadm2、创建阵列mdadm -Cv /dev/md5 -l 5 -n 2 /dev/sdb /dev/sdc /dev/sdd或是mdadm -Cv /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd参数详解:-C 创建阵列-l 指定raid级别 5-v 显示细节-x, --spare-devices=:指定初始阵列的富余device 数目-n,--raid-devices=指定

2022-06-09 13:05:15 2827

原创 centos7系统资源监控命令

一、top二、htop三、atop四、ptop五、slaptop六、glances

2022-06-03 12:26:44 378

原创 【java网络编程】零拷贝

零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。应用程序和磁盘之间想要传输数据,是没有办法直接进行传输的。整个过程为:应用程序向操作系统发起一个读请求,那么首先磁盘中的数据会被读取到内核地址空间中,然后会把内核地址空间中的数据拷贝到用户地址空间中

2022-06-02 13:16:13 278

原创 【java网络编程】netty框架

netty是一个高性能、异步事件驱动的NIO框架,它基于Java Nio提供的API实现,提供了对TCP、UDP和文件传输的支持。Reactor是一种并发处理客户端请求响应的事件驱动模型。服务端在接收到客户端请求后采用多路复用策略,通过一个非阻塞的线程来异步接收所有的客户端请求。一个线程负责建立连接、读、写等操作。如果在业务中处理中出现了耗时操作,就会导致所有请求全部处理延时。只是在单线程的模型情况下,使用线程池管理多个线程,用多线程进行处理业务。该模型采用一个主Reactor仅处理连接,而多个子React

2022-06-01 20:33:11 5079 1

原创 【java网络编程】io模型

BIO全称(blocking I/O):同步阻塞。当客户端有连接请求时,服务端就会需要启动一个线程对客户端的连接进行数据读写,如果客户端不进行读写了,那么这个线程也会等着,这样就会造成阻塞。服务端:客户端服务端客户端缺点:当用户进程发出read操作时,如果kernel中的数据还没有准备好,,那么他并不会block用户进程,而是立马返回一个 error,从用户角度来讲,他发起一个read操作后,并不需要等待,而是马上等到一个结果,用户进程判断是一个error时,他就知道数据换没有准备

2022-06-01 13:34:17 179

原创 java对象头详解

对齐:要求能被8字节整除,如果不能,则需要对齐填充(寻址最优,64位机器正好8个字节)ClassLayout类打印对象头看一看对象布局HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头:比如 hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程)ID,偏向时间,数组长度(数组对象)等。Java对象头一般占有2个机器码(在32位虚拟机中,1个机器..

2022-05-31 20:39:31 17663 8

原创 java保证线程安全的5种方式

一、互斥同步锁1、synchronized关键字参考:【java并发编程】synchronized关键字原理_现实、太残忍的博客-CSDN博客2、lock接口参考:​​​​​​​【java并发编程】lock接口_现实、太残忍的博客-CSDN博客3、分布式锁参考:​​​​​​​java分布式锁的三种实现方式_现实、太残忍的博客-CSDN博客二、非阻塞同步1、cas乐观锁(共享线程安全变量)cas+volatile保证线程安全参考:【java并发编程】cas乐

2022-05-31 19:02:00 3038

原创 【java并发编程】ThreadLocal线程本地类

一、简介ThreadLocal类是作为线程内部的局部变量而提供的。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。通过ThreadLocal创建的变量只能被当前线程访问,对其他线程不可见,故别的线程无法访问和修改,也就是说:对线程公有化变成对线程私有化。事实上每个线程中都有一个ThreadLocal变量副本。相比于锁的性能:java在使用锁的使用中会导致运行效率降低,ThreadLocal的使用彻底避免对共享资源的竞争,同时又可以不影响效率.

2022-05-31 18:07:57 897

原创 【java并发编程】volatile关键字

一、简介保证线程可见性,有序性,但不保证原子性(voilatile是cpu级别的缓存锁,java层面可以不需要关心它,因此需要加上cas才能保证线程安全性)。所以voilatile不能保证线程安全,但是适用于一个线程写,多个线程读的情况。确保线程每次读取,都是读的内存中的实时值,而不是寄存器的旧值。二、JMM内存模型全称java memory model中文名为java内存模型。如图:每个java线程都有自己的工作内存,线程需要操作哪个变量,需要从主内存中load到自己的工作..

2022-05-31 14:38:02 199

原创 【java并发编程】AQS框架

简介aqs全称抽象队列同步器是AbstractQueuedSynchronize抽象类。它是一个用来构建锁和同步器的框架,它底层用了CAS技术来保证操作的原子性,同时利用FIFO队列实现线程间的锁竞争,将基础的同步相关抽象细节放在AQS,它能够成为实现大部分同步需求的基础,也是JUC并发包同步的核心基础组件。Lock、ReadWriteLock、CountDowndLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor等都是在AQS的基础上实现的。A.

2022-05-31 09:50:50 1042

原创 【java并发编程】cas乐观锁

一、cas是什么?cas全程Compare and swap,比较并交换。一种无锁原子算法,是一种乐观锁,用于原子性的更新变量。二、cas实现原理CAS靠硬件实现,是一条CPU的原子指令,基于汇编指令cmpxchg(Intel x86)实现,其作用是让CPU先比较两个值是否相等,然后原子性地更新某个内存地址的值。三、cas操作在java使用unsafe类中的compareAndSwapInt方法是经典实现进入native方法,在c++源码unsafe.cpp文件中

2022-05-30 21:49:12 789

原创 java unsafe魔法类

一、简介Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的。二、unsafe类各方法介绍unsafe类大部分是native方法,内容对应jdk源码中的unsafe.cpp文件,主要包含:1、系统相关。主要返回某些低级别的内存信息。如:addressSize()返回系统指针大小 pageSize()返回内存页大小2、对象操作主要提供Object和它的域.

2022-05-30 19:55:03 287

原创 【java并发编程】lock接口

一、简介java中的lock接口,功能与synchronizied关键字类似。用来处理同步操作。jdk1.5之前使用synchronizied关键字完成同步作用。jdk1.5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,只需在使用时显式地获取和释放锁。虽然它缺少了synchronized隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。相比synchronized关键字lock好

2022-05-30 17:18:16 938

原创 java队列有哪些

java中队列接口是Queue。它的子接口中包含两大类BlockingQueue阻塞队列和Deque双端队列,主要的继承结构如下:一、一般队列1、PriorityQueue优先级队列属于线程不安全队列,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于java多线程环境2、ConcurrentLinkedQueue并发链表队列无锁结构二、Deques双端队列接口1、ArrayDeque2、LinkedList

2022-05-30 14:07:58 1674

原创 【java并发编程】无锁并发框架disruptor

一、简介Disruptor是一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列。基于Disruptor开发的系统单线程能支撑每秒600万订单。使用场景:对延时要求很高的场景二、高性能原理1、无锁内部实现都是cas+voilatile实现的,无锁性能比加锁更高2、环形数组(关键)好处:数组比链表性能好,索引快 环形数组中的元素采用覆盖方式,避免了jvm频繁的GC。 数组的大小必须为2的n次方,元素定位可以通过位运算效率会更高3、生产和消费模

2022-05-30 12:32:00 1494

原创 【java并发编程】synchronized关键字原理

所有的Java 对象都有自己唯一的隐式同步锁。该锁只能同时被一个线程获得,其他试图获得该锁的线程都会被阻塞在对象的等待队列中直到获得该锁的线程释放锁才能继续工作。synchronized锁的几种状态jdk1.6及以前,synchronized是重量级锁(需要靠操作系统阻塞和唤醒,因此效率不高)jdk1.6之后,synchronized锁分为4种状态(锁升级过程)原本是“无锁”状态 一个线程加锁,将线程id写入对象头markwork,升级为“偏向锁” 多个线程cas加锁,轻量竞争,升级

2022-05-29 21:56:08 734

原创 java分布式锁的三种实现方式

分布式锁的核心思想,就是使用外部的一块共享的区域,来完成锁的实现。一、使用mysql数据库实现(基本不用)1、使用数据库悲观锁可以使用select ... for update来实现分布式锁。例如:建一个lock表,获取锁就是插入一条数据,移除锁就是删除掉这条数据,使用mysql的for update来保证原子性。2、使用数据库乐观锁增加一个version字段,每次更新修改,都会自增加一。例如:为id是1的用户余额加10select version,balance f.

2022-05-29 19:09:05 7055

原创 mysql索引原理

mysql索引原理首先介绍一款可以帮助理解数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html一、数据结构索引是一种特殊的数据结构。可以帮助我们快速查询到数据。(1)二叉树二叉树是一种特殊的树,每个节点最多有两个子节点,值从左到右依次递增。例如:当想查询值为11的数据时,如果没有索引要按顺序查找多次,有索引只查三次,加速了查询数据。问:为什么索引的数据结构不用二叉树?因为当值依次递

2022-05-28 20:24:49 8300 1

原创 java jni使用

1、创建java maven项目创建一个JniDemo类package com.sumengnan;public class JniDemo { static { //第一种方式:直接写全路径名+文件名 System.load("/Users/sumengnan/CLionProjects/jniSharedLib/libjniSharedLib.dylib"); //第二种方式:只写去掉前缀和后缀的文件名去掉libxxx.dy.

2022-05-28 20:10:25 1293

原创 centos7查看硬件温度,如cpu

lm_sensors,是一款基于linux系统的硬件监控的软件。可以监控主板,CPU的工作电压,风扇转速,温度等数据。一、安装lm_sensors软件yum -y install lm_sensors二、传感器检测sensors-detect全部输入yes三、查看硬件温度sensors...

2022-05-28 15:43:57 5380

原创 centos7关闭虚拟内存

一、临时关闭swapoff -a二、永久关闭vim /etc/fstab注释掉swap行

2022-05-28 13:44:20 942

原创 centos7查看磁盘信息有关命令

一、lsblk命令lsblk命令可以列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,CD-ROM等等二、df -h命令df -h命令用于查看已挂载磁盘的总容量、使用容量、剩余容量等三、fdisk -l命令fdisk命令可以用于对2TB以内的磁盘进行添加、删除、转换分区的功能,用户可以根据实际情况进行合理划分。fdisk -l可以查看设备的分区表状况(但是无法查看到 GPT 磁盘的分区)四、par..

2022-05-28 13:20:24 25470

原创 linux tar多线程压缩解压

由于gzip工具是单线程工作的,无法发挥多核心cpu的优势,所以需要多线程压缩解压1.安装pigz命令yum-y install pigz2.压缩操作tar -cvpf - $Dir | pigz -9 -p 6 $target-nametar -cvpf - /home/admin/abcd | pigz -9 -p 6 abcd.tgzpigz:-9 : 代表压缩率-p : 代表CPU数量3、解压操作tar --use-compress-program=pigz.

2022-05-28 12:44:28 6230

原创 centos7安装ngrok内网穿透

一、环境要求:1、有公网ip2、有域名二、搭建golang环境wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gztar -C /usr/local/ -zxvf go1.13.4.linux-amd64.tar.gz #配置系统变量echo 'export PATH=$PATH:/usr/local/go/bin'>>/etc/profilesource /etc/profile go

2022-05-28 12:28:51 987

原创 centos7安装nfs服务并开启防火墙防护

一、安装nfs服务yum install nfs-utils rpcbind -ysystemctl start rpcbindsystemctl enable rpcbindsystemctl start nfssystemctl enable nfs二、只允许指定ip访问vim /etc/exports/mnt 192.168.0.191(rw,no_root_squash,sync,insecure)内网穿透的只能是localhost三、设置防火墙vim

2022-05-27 18:58:58 2098

原创 centos7校正系统时间

yum install -y ntpdatentpdate -u ntp.api.bzdate

2022-05-27 18:53:43 305

原创 centos8修改yum源为阿里

1、vim /etc/yum.repos.d/CentOS-Linux-Base.repo# CentOS-Linux-Base.repo[BaseOS]name=CentOS-$releasever - Base#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra#baseurl=http://mirror.cent..

2022-05-27 18:50:56 402

原创 mybatis使用resultMap嵌套collection查不出数据

现象:使用mybatis使用resultMap嵌套collection时,明明数据库有数据,就是查不出来mapper文件内容:数据库sql查询,确认数据存在:mapper返回的结果集:最终发现:之前为了列表接口返回空数组,而不是null。所以由于重写了replies属性把重写去掉就好了...

2022-05-14 21:38:48 2020

原创 c使用curl进行http访问

一、引入libcurl库1、第一种方式brew install curl命令2、第二种方式下载ssl,地址:https://www.openssl.org/source/openssl-3.0.2.tar.gz下载curl,地址: https://curl.se/download/curl-7.82.0.tar.gz并使用cmake ,指定ssl地址并 make编译(同c连接redis笔记,拿到libcurl.a和curl.h文件)cmake ../ -DOPENSSL_ROO

2022-03-24 12:54:20 1711

原创 c操作json数据

1、json库下载GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI Ccmake .编译、 make编译,保留cJSON.h和libcjson.a文件项目CMakeLists.txt引入:include_directories("/Users/sumengnan/CLionProjects/testc/include")link_directories("/Users/sumengnan/CLionProj

2022-03-24 12:49:32 446

原创 c连接mysql数据库

cmake文件引入mysql头文件和静态链接库cmake_minimum_required(VERSION 3.21)project(testc C)set(CMAKE_C_STANDARD 99)#添加头文件目录 (相当于gcc中-l参数,也相当于环境变量中增加路径到cplus_include_path变量的作用)#语法:include_directories("/opt/……/extern/include") (相当于export CPLUS_INCLUDE_PATH=CPLUS_I

2022-03-24 12:45:30 2065

空空如也

空空如也

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

TA关注的人

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