自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 资源 (2)
  • 收藏
  • 关注

原创 行为型设计模式

行为型设计模式目的是将多个类或对象相互协作,共同完成单个类或对象无法单独完成的任务。行为型设计模式共11种,分别为解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式。......

2022-06-04 19:27:46 3355 1

原创 结构型设计模式

结构型设计模式目的是将现有的类或结构组合到一起形成更强大的结构。结构型设计模式共7种分别为适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。一、适配器模式顾名思义适配器模式是将原本不匹配的两个东西适配到一起使用,以三孔插座、两孔插头及插排为例demo如下:1.类适配器新建三孔插座类ThreeHolesSocketpublic class ThreeHolesSocket { /** * 三孔插座输出电流 * @retur...

2022-03-16 22:51:48 807 1

原创 创建型设计模式

创建型设计模式共5种,分别为工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。一、工厂方法模式 工厂方法模式指定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。 在工厂方法模式中存在四种角色,分别为抽象工厂,具体工厂,抽象产品,具体产品。具体工厂及具体产品是对抽象工厂及抽象产品的实现。使用抽象工厂可以对业务进行解耦,提升灵活性,屏蔽工厂内产品细节,但每增加一种产品都需要增加对应的具体产品及具体工厂,代码复用性...

2022-03-01 20:01:02 4028

原创 设计模式原则

一、开闭原则 开闭原则(OCP,Open Closed Principle)是面向对象设计的最基础原则,其核心可以概括为对扩展开放,对修改封闭。这句话意思是当需求变更时可以对原有代码进行扩展实现新功能,不需要改动原有代码。举个不太恰当的例子。例如原有三轮车销售店只销售三轮车,因业务扩张现在也销售自行车。此时比较能体现开闭原则,我们可以再遵循三轮车定义方法重新处理自行车的逻辑。...

2022-01-11 23:03:41 143

原创 使用NetworkInterface解决InetAddress.getLocalHost().getHostAddress()获取ip为127.0.0.1问题

InetAddress.getLocalHost().getHostAddress() 根据本机名去/etc/hosts中获取对应ip,所以经常会出现获取到127.0.0.1的情况,使用NetworkInterface.getNetworkInterfaces()从网卡中获取ip可避免该情况。工具类如下import java.net.Inet4Address;import java.net.InetAddress;import java.net.NetworkInterface;...

2021-12-10 21:24:51 3901

原创 linux 5种IO模型

linux系统中,一切皆文件,在操作文件过程中使用不同操作模式会对性能造成极大影响。目前linux存在五种IO模型。同步阻塞IO 同步阻塞IO是最简单,最常用的模型,其流程为用户线程向内核空间发起调用,内核空间将数据准备好后返回到用户空间,在此过程中用户线程阻塞。同步非阻塞IO同步非阻塞IO是在同步阻塞IO的基础上,将socket设置为NONBLOCK。这样做用户线程可以在发起IO请求后可以立即返回,但用户线程需要不断循环获取内核处理结果...

2021-10-31 22:42:36 152

原创 rocketmq事务消息

rocketmq事务消息可以用来实现分布式事务,其核心思想为两阶段提交,回调复查,下面是rocketmq事务消息执行流程图。1.生产者向mq发送半消息。2.mq收到半消息返回半消息发送成功。3.执行本地事务。4.根据本地事务执行结果判断半消息提交或回滚。5.如果没有收到第四步通知则定时回调。6.处理回调消息,检查本地事务执行结果。7.根据回调...

2021-10-18 20:43:48 435

原创 jvm处理异常

java中所有异常都是Throwable 类或者其子类的实例,Throwable类有两个直接子类Error、Exception。Error为应用程序无法捕获的异常,发生Error时需要中止线程。Exception与Error不同,发生时可捕获异常进行处理。 处理异常包括使用try,catch,finally关键字进行处理 try:标记需要捕获异常的代码。 catch:指定捕获某种异常进行处理。 finally:在try、...

2021-10-12 22:06:39 243

原创 高性能队列Disruptor

Disruptor是由LMAX开发的一款高性能的有界内存队列,因其卓越的性能,目前再业内广泛应用,LMAX官网使用It’s fast. Very fast.来介绍Disruptor。下图是Disruptor团队对Disruptor与ArrayBlockingQueue

2021-10-08 21:43:32 188

原创 kafka集群搭建

本文基于kafka2.8.0,下载时需注意kafka有两个版本号以我的举例kafka_2.12-2.8.0,2.12为scala版本号,2.8.0是kafka版本。1.点击官网kafka下载,将安装文件上传到服务器。2.将文件解压出三份,分别放入kafka9092,kafka9093,kafka9094目录内。3.编辑server.properties配置文件每个broker在集群中唯一标识,每个实例需指定不同brokeridbroker.id=0端口号,部署在同一台...

2021-09-30 22:01:01 206

原创 rocketmq推拉模式

rocketmq可通过push与pull方式对消息消费,下面简单介绍下两种方式使用及优缺点。首先引入rocketmq相关jar,并创建生产者 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.9.1</version> &l...

2021-09-25 16:29:57 853

原创 rocketmq顺序消费

在rocketmq总topic下包含多个queue,发送消息时如果不指定会随机发送到不同queue,此时消费者无法保证顺序消费。参考下图,发送时发送了producetMessage0-producetMessage9,但消费时顺序变了。 解决顺序消费的方法比较简单,第一步是在生产者发送时将消息发送到同一个queue。要达到该效果可以实现MessageQueueSelector,在其select方法中自定义发送到哪个queue。代码如下:public class ...

2021-09-21 22:12:58 255

原创 centos7 rocketmq单机与可视化管理界面部署

单机部署1.通过官网下载rocketmq ,点击下载地址选择安装包下载2.上传到服务器并进行解压unzip rocketmq-all-4.9.1-bin-release.zip 3.进入rocketmq-all-4.9.1-bin-release/bin修改runserver.sh与runbroker.sh中java占用内存大小(这个根据就机器情况修改,配置好可以直接启动)4.启动NameServer(rocketmq-all-4.9.1-bin-release下),可.

2021-09-20 23:59:17 996

原创 kafka消费者组与重平衡

消费者组消费者组(Consumer Group)是kafka提供的可扩展且具有容错性的消费者机制。其特性如下。 1.一个消费者组包含多个消费者,它们共享一个gruop id,但一个消费者只能在一个消费者组中。 2.消费者组订阅的topic下的一个分区只能被组中一个消费者消费(设置消费者时最好分区数=消费者数)。 3.不同消费者组中的消费者可以消费同一个topic下的同一个分区。 通过以上特性,当所有消费者都在一个...

2021-09-18 21:56:53 565

原创 java内存模型JMM

java内存模型主要目的是定义程序中各个变量访问规则。就是虚拟机中将共享变量存储到内存和从内存中取出变量这样底层细节。共享变量包括实例字段、静态字段、构成数组对象的元素。Java内存模型中规定了所有的变量都存储在主内存中,每个线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来...

2021-09-16 23:09:25 93

原创 No implementation defined for org.apache.commons.logging.LogFactory排查思路

该问题在webservice调用时突然出现,项目中其他模块均可正常工作,首先怀疑是最近引入了什么jar冲突导致,eclipse打开pom点击Dependency Hierarchy搜索相应jar后进行排除。 排除后调用仍报错,参考网上解决方案引入以下包排除所有commons-logging后引入commons-discovery与commons-logging仍无效果。<dependency> <groupId>c...

2021-09-14 21:37:33 968

原创 centos7安装docker

1.uname -r 查看linux内核,docker在centos7上要求内核版本为3.10+,一般机器都满足该要求。2.yum update更新yum包。3.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux doc

2021-09-13 22:51:30 85

原创 2013 - Lost connection to MySQL server during query处理思路

今天线上有几条sql执行1800s后失败了,报如下错误。 我碰到这种问题第一反应反手甩锅运维,让运维改参数,比如修改以下参数max_allowed_packet:mysql服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小,该参数最大1G,可通过set global修改。net_read_timeout:读取超时时间默认30分钟。可通过set global修改。net_write_timeout:...

2021-09-09 02:01:22 550

原创 eclipse 使用jmh

大部分开发人员测试时通常使用System.currentTimeMillis计算方法执行时间,但这种方式没有考虑到jvm层面的优化,很多时候得出的测试结果不够精确。如果想进行精确测试还需要使用jmh,其全名为Java Microbenchmark Harness,是由 java 虚拟机团队开发的一款用于 java 微基准测试工具。jmh包含多种测试维度,使用也比较简单。常用注解@BenchmarkMode:对应Mode类,表示测试是使用不同模式,可以使用数组方式例如{Mode.Th...

2021-09-07 21:31:33 348

原创 centos7更换yum源

1.安装wgetyum install wget2.进入yum配置文件路径cd /etc/yum.repos.d/3.备份原有yum源mv CentOS-Base.repo CentOS-Base.repo.bak4.下载阿里yum源wget -O http://mirrors.aliyun.com/repo/Centos-7.repo5.更换阿里yum源为默认源mv Centos-7.repo CentOS-Base.repo6.更新本地缓存清

2021-09-04 15:48:37 130

原创 mysql 提取字符串中数字

开发过程中经常会遇到一些提取字符串中数字做递增的需求,例如把杭上0001人调字第X号与杭上清0005人调字第X号取出数字做递增,这种没什么规律,又不好截取,如果能提取出汉字中对应的数字取最大值做递增就很方便了。 提取字符串思路就是遍历字符串中每个字符,判断ascii码是否是数字,在这使用自定义函数实现创建自定义函数CREATE FUNCTION get_number (param varchar(50))RETURNS varchar(30)BEGIND...

2021-09-02 21:39:51 4144

原创 限流算法及guava限流器RateLimiter实现

限流是通过对并发请求进行限速,继而达到保护高并发系统的目的。常见限流算法有漏桶算法及令牌桶算法。其流程可参考下图。漏桶算法思路比较简单,就是将请求放入桶中,然后以固定速率处理桶中请求,当桶满后会丢弃新来的请求。漏桶算法一般依靠有界队列实现。 令牌桶算法则是先创建一个固定大小的令牌桶,按照固定速率向桶中加入令牌,每个请求要先获取到令牌才能进行处理。没获取到令牌的请求则放入缓冲区等待或直接丢弃。 guava限流器RateLimiter...

2021-09-01 21:51:09 344

原创 HotSpot编译优化

HotSpot团队在即时编译中采用了一些比较经典的优化手段使编译器编译出运行时最优性能的代码。方法内联 在程序执行过程中,调用一个方法通常要经历入栈和出栈。其执行流程为先将程序执行顺序转移到存储该方法的内存地址,将方法的内容执行完后,再返回到执行该方法前的位置。这种调用流程会产生一定的时间及空间开销。对于一些方法体不大,但调用比较频繁的方法来说,会产生很大的时间和空间的消耗。方法内联就是将被调用方法的代码复制到发起调用的方法之中,避免发生真实的方法调用。方法内联可参考以下...

2021-08-29 22:50:16 145

原创 HotSpot编译器与即时编译

大部分主流商用虚拟机中都包含解释器与编译器,解释器与编译器用处不同,当程序需要迅速启动和执行时,解释器先发挥作用,省去编译时间,立即执行。在程序运行后,随着时间推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。在java8中默认使用解释器与编译器搭配的混合模式(mixed mode),如果想只使用解释器可以通过设置-Xint强制虚拟机运行于解释模式(interpreted iode),此时编译器不介入工作。如果想只使用编译器可以通过设置...

2021-08-28 21:29:42 341

原创 java线程生命周期

线程生命周期指线程从创建到消亡中间经历的一系列状态,理解线程生命周期中各种状态对排查多线程bug有一定帮助。目前java线程生命周期基于通用线程生命周期细分为六种状态。通用生命周期 通用生命周期包括新建、就绪、运行、阻塞、死亡五种状态。各状态详细情况如下: 新建:线程在编程语言中被创建,但操作系统中还没分配cpu。 就绪:线程在操作系统中被创建,可以分配cpu执行。 运行:有空闲cpu时,操作系统将cpu分配给就绪状...

2021-08-26 22:24:37 345

原创 tomcat线程池

tomcat基于java线程池进行扩展,通过自定义队列,线程工厂,任务处理流程。在确保请求不会丢失的情况下,限制高并发防止系统资源耗尽。 StandardThreadExecutor中startInternal执行具体tomcat线程池创建流程。/*** max number of threads*/protected int maxThreads = 200;/*** min number of threads*/protected int min...

2021-08-25 22:24:16 275

原创 tomcat连接器

连接器是tomcat核心组件之一,负责处理外部连接响应目前连接器支持HTTP/1.1、HTTP/2、AJP三种协议,支持NIO、NIO2、APR三种IO模型。连接器与另一核心组件容器构成service组件,通过配置多个service可实现不同协议不同端口访问。 连接器主要工作流程可分为以下几步:1.监听端口,接受请求获取网络字节流。 2.解析字节流,生成tomcat request对象。 3.将tomcat reque...

2021-08-24 21:57:12 706

原创 java 类加载器与双亲委派机制简介

类加载器 类加载器负责将.class文件加载到jvm中运行,java内置如下三种类加载器,除内置类加载器外,还可以自己实现类加载器。BootstrapClassLoader:启动类加载器,加载 jre/lib 目录下的核心类库ExtClassLoade:扩展类加载器,加载 jre/lib/ext 目录下的文件 AppClassLoader:应用程序类加载器负责加载classpath下字节码文件 自定义类加载器请参...

2021-08-22 18:04:01 158 2

原创 mysql5.7 change buffer简介

change buffer(更改缓冲区)是mysql对普通索引写操作做的优化,当要进行写操作的数据不在buffer pool中,则会将写操作记录到change buffer中,达到降低磁盘写入频率的目的。刷盘时机 1.后台线程定期进行merge数据。 2.mysql正常关闭。 3.访问change buffer中数据。相关参数innodb_change_buffering:控制哪些操作可以写入change bu...

2021-08-20 21:45:28 425

原创 spring cloud使用nacos配置中心

nacos配置中心用于存储项目中相关配置,使用配置中心可以达到配置统一管理,动态刷新配置等效果。 nacos配置中心使用比较简单,但坑也不少,先简单介绍下使用再说坑。1.引入spring cloud使用nacos配置中心的jar,spring boot 相关jar自己引一下。 <!-- 引入 spring-cloud-starter-alibaba-nacos-config,此jar要与spring boot版本对应--> <depende...

2021-08-19 23:08:10 4991 1

原创 nacos集群搭建

nacos主要分为注册中心与配置中心,注册中心与zookeeper、eruka类似,用来做服务发现,服务注册。配置中心用来做动态配置。目前nacos最新版本为2.0.3,下面以2.0.3版本演示搭建流程。1.下载nacos压缩包点击跳转github下载2.上传压缩包至服务器解压后复制三份,分别为nacos8848,nacos8850,nacos8852。3.进入解压后conf目录,修改application.properties文件,指定端口为8848,8850,8852,nac...

2021-08-18 22:42:56 247

原创 nginx+tomcat集群配置

nginx是一个常见的轻量级反向代理服务器,以高并发,高性能,高可靠性而闻名。目前大部分集群使用nginx搭建。下面为nainx+tomcat集群搭建流程。1.下载nginx(nginx下载地址)与tomcat(tomcat下载地址)安装包并上传到服务器2.解压tomcattar -zxvf apache-tomcat-9.0.523.进入解压后tomcat,修改conf目录下server.xml关闭tomcat端口分别修改为8005,8006<Server...

2021-08-17 21:11:29 900

原创 ThreadLocal 使用及原理

多线程并发操作一个共享变量时会造成线程安全问题,使用ThreadLocal可以保证共享变量线程安全。由于同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本,当线程访问ThreadLocal时,每个线程都操作自己的独立副本,避免造成线程安全问题。简单使用 每个线程分别对ThreadLocal赋值、打印。 static ThreadLocal<String> threadLocal = new ThreadLocal&l...

2021-08-16 22:57:45 157

原创 java 线程池使用及工作流程

java程序中线程的创建、销毁将会消耗一定的系统资源,从而增加系统的性能开销,为解决该问题,java引入线程池概念,对于频繁创建线程的业务场景,线程池可以创建固定的线程数量,通过lwp映射到系统内核。内置线程池 内置线程池有四种,本质是对ThreadPoolExecutor封装。相对来说优点是拿来即用,缺点也很明显,无法根据自己需求配置不同参数线程池。目前还没用过内置线程池。类型 创建方式 特性 newCachedThreadPool Exec...

2021-08-15 22:52:33 365

原创 redis 实现分布式锁

在单机系统中可以将锁的标识放入应用内存中。但分布式系统中需要将锁的标识放入共享存储系统中,如果不要求强一致性可以使用redis作为共享存储系统。单节点分布式锁 单节点分布式锁指应用在设置标识时只操作单节点redis,如果对可靠性要求不高可以使用单节点实现分布式锁。其实现也比较简单。主要利用redis单线程处理请求模式设置锁标识。 流程如下图: 1.线程A,B两个请求,A先进入redis对flag进行setnx操作(setnx key ...

2021-08-14 21:18:20 195

原创 spring boot 使用redistemplate操作redis

redistemplate是spring对jedis的封装。相对于jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用。以下为redistemplate简单使用。1.引入spring-data-redis <!-- 对于版本号没有要求不需要显示指定version,spring boot已集成该jar --> <dependency> <groupId>org.springframework.data</gro...

2021-08-13 23:18:30 975

原创 redis原子操作(单命令与lua脚本)

原子操作是指执行过程不需要加锁并且保证多个操作是原子性的,使用原子操作可以保证并发时数据准确性,降低对系统性能的影响。比如记录投票数分为3步,先读取原投票数,然后将原投票数加1,最后写回redis。如果不使用原子操作并发情况下会造成投票丢失等问题。加锁的话会降低系统性能,而且加锁就不多说了,只能说做的多错的多,能不加锁就不加锁。redis提供以下两种原子操作方法。单命令操作 由于redis使用单线程来串行处理客户端的请求操作,所以当 redis 执行...

2021-08-12 21:42:54 3756

原创 redis集群中hash tag 使用

hash tag用于redis集群中。其实现方式为在key中加个{},例如test{1}。使用hash tag后客户端在计算key的crc16时,只计算{}中数据。如果没使用hash tag,客户端会对整个key进行crc16计算。下面演示下hash tag使用。127.0.0.1:6380> cluster keyslot user:case(integer) 9491127.0.0.1:6380> cluster keyslot user:case{1}(inte...

2021-08-10 23:07:11 7373

原创 redis cluster 集群搭建及常见操作

随着业务增长,redis中需要缓存的数据会越来越多。例如现有redis实例内存为4G,但业务增长后需要存储redis中数据为5G。对于此情况常见的两种常见解决方案就是加机器配置或者搭建集群,下面我列个表格比较下两种方案优缺点。 优点 缺点 加配置 快、简单 一、实例中数据越来越多,生成RDB时fork阻塞时间越来越长。 二、主从情况下:主库加配置从库也要相应的加配置 三、主库挂了,从库只能读,不能写 集群 一、...

2021-08-09 22:30:40 1257

原创 java CountDownLatch 原理及使用

countDownLatch可以理解为一个倒序计数器,在初始化时给计数器赋值,每次操作计数器减1,等计数器为0后才可继续向下执行。通过该特性可以在特定任务执行前使用多线程处理,例如多线程读取文件,然后对文件拼接整合。使用案例 以下代码演示初始CountDownLatch为2的执行流程,当new CountDownLatch(3)时程序会一直阻塞。 public static void main(String[] args) throws InterruptedEx...

2021-08-08 22:28:29 2227

charles-proxy-4.5.6-win64.zip

抓包工具

2021-09-29

redisDemo.zip

redisDemo.zip

2021-08-12

空空如也

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

TA关注的人

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