自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 图片上传组件

项目需要多张图片上传回显,图片上传后返回图片ID,不返回url,需要通过图片ID获取token然后再拼接成图片下载的URL。选择el-upload组件进行开发。

2024-03-10 16:29:44 379

原创 类加载问题汇总

类加载时机(主动引用)new、getStatic、putStatic,invokeStatic指令时加载。反射调用时,如果类没有进行init,会先init。作为父类加载。JVM启动时指定的主类。java.lang.invoke.MethodHandler被动引用通过子类引用父类的静态字段,不会加载子类。定义引用类数组,底层是Object类型不会加载引用类型。使用类的静态常量池不会触发类加载。类加载过程加载:通过类的全限定名来获取类的二进制字节流。将字节码静态结构转化为方

2020-09-29 13:27:17 248

原创 volatile问题汇总

volatile作用可见性:所有线程都能看到共享内存的最新状态,不保证操作的原子性。防止指令重排。volatile原理从Java内存模型理解,volatile要求d读操作(read、load、use),写(assign、store、write)动作必须连续出现,从而保证读操作会先刷新工作内存,写操作会立即同步到主内存。通过内存屏障控制CPU的store buffer和invalid queue的行为来防止指令重排。Store buffer 和Invalid QueueCPU修改Cac

2020-09-27 23:20:29 323

原创 进程问题汇总

进程状态创建状态:初始化进程控制块PCB,分配进程运行需要的资源。就绪状态:进程已拥有除CPU以外所有资源,进入就绪队列,等待CPU调度。运行状态:已获得CPU,正处于执行的状态。阻塞状态:由于发生某些事件(IO请求、缓冲区申请失败等)暂时无法执行,进入阻塞状态。终止状态:进行进程的清理工作,回收PCB。僵尸进程进程结束后没有被完全销毁,而是留下了成为僵尸进程的数据结构。进程结束后仍然会保留包括进程号、退出状态、运行时间的信息,占用进程号不释放。避免方法:通过wait/waitp

2020-09-27 18:29:12 316

原创 LeetCode134

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。来源:力扣(LeetCode)暴力解法就是枚举每个起点i,从i开始能否完成一周,这里很多重复计算。假设从起点i开始最多能够到达某一点j,那么i+1最多也只能到达j。很多起点都可以直接跳过,需要考虑的点应该是从i无.

2020-09-27 17:38:50 112

原创 隔离级别问题汇总

隔离级别分类事务隔离级别脏读不可重复读幻读读未提交是是是不可重复读否是是可重复读否否是串行化否否否什么是幻读事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据称为幻读。如果事务A 按一定条件搜索, 期间事务B 删除了符合条件的某一条数据,导致事务A 再次读取时数据少了一条,这种情况归为不可重复读。RR隔离级别如何实现使用MVCC保证快照

2020-09-27 11:12:07 209

原创 索引问题汇总

什么是索引?索引是保证MySQL高效查询数据的数据结构索引减少服务器需要扫描的数据量。索引可以避免排序和临时表。索引可以将随机IO变为顺序IO。索引有哪些数据结构B-Tree索引HASH索引Full-Text索引R-Tree索引B-Tree索引结构一个m介B树的定义如下:每个节点最多有m个子树根节点不是叶子节点,至少有两个子树。除根节点之外的所有非叶子节点至少有m/2棵子树。所有非叶子节点中包含k个关键字和k+1个子树。所有叶子节点都出现在同一层次,并且不带信息,视

2020-09-27 09:06:59 346

原创 背包DP总结

01背包问题:有n个重量和价值分别为wi和vi的物品,从这些物品中挑出总重量不超过m的物品,求所有挑选方案中价值总和的最大值。使用dfs搜索时依次对第i种物品都考虑选择或不选择,如果选择那么剩余容量为m-wi,然后在剩余的物品中继续搜索;如果不选择那么剩余容量不变,继续在后面的物品中搜索。使用动态规划的方法,则把每次开始搜索时容量和当前需要判断的物品看做一个状态,得到的转移方程为dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi]+vi)dp[i][j]=max(dp[i-1]

2020-09-23 16:04:38 220

原创 HTTPS

《图解HTTP》-- HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。HTTPS请求过程client向service发送请求service将自己的公钥发送给clientclient验证service的公钥,确保公钥是service的。client生成一个随机密钥用于后续和service通信,并用ser.

2020-09-19 22:49:41 136

原创 方法调用字节码命令

指令invokeinterface调用接口方法,在运行时搜索一个实现了这个接口方法的类型invokevirtual调用对象的实例方法,根据对象的实际类型进行分派invokedynamic允许应用级别的代码来确定执行哪一个方法调用invokevirtualinvokevirtual常用与动态分派,即调用子类重写的方法,这里不同于调用接口方法。动态分派使用了虚方法表实现,虚方法表中只会存放可以被重写的方法,而且通常不会包含接口方法。如果虚方法表中将父类的虚方法表中的...

2020-09-18 11:06:34 156

原创 小和归并

给一个数组,对每个元素计算数组左边比当前元素小的元素和,最后将这些结果再求和。例如{1, 3, 5, 2, 4, 6}的小和为1+4+1+6+15=27。这个题实际上是逆序数的变形,以元素3来说,后面的5,4,6比3大,所以小和都会将其计算一次,所以我们想要计算是对于任意元素i,右边比i大的元素个数。考虑归并排序能将左右两个有序数组合并,对于左边的任意元素i,都能计算得到右边比i大的元素个数。每一轮合并都能计算的到元素i右边比其大的元素个数,经过所有合并之后,就得能得到原数组中在i右边且比i大的元素个数。

2020-09-17 09:39:13 150

原创 KMP和扩展KMP算法

KMP算法KMP算法能解决问题为:给一个主串S,模式串P,计算S中是否包含P,以及出现的位置。当模式串P和主串S从S[i]匹配到长度L时失配,如果使用暴力匹配则需要从S[i+1]重新匹配,匹配位置在主串上出现回退。当模式串和主串S匹配长度L失配,那么从S[i]开始长度为L-1的子串与P的前L-1个字符是相同的,所以实际上重新匹配时模式串P和主串的S[i+1]匹配等价于模式串P和模式串的子串P[1]的匹配。利用这个现象可以提前计算出关于模式串P的一些匹配规则,可以加快匹配速度。KMP算法计算的是失配数组

2020-09-17 09:20:18 214

原创 PoolThreadCache简单理解

PoolThreadCache用户缓存线程申请的内存,Netty中内存需要从PoolArena中申请,而这些申请到的内存在使用完之后不会立刻还给PoolArena,而是将其缓存到线程局部变量中,PoolThreadCache正是是线程局部变量,其创建基于PoolThreadLocalCache,PoolThreadCache作为一个中间层又在一定程度上提高了内存的分配效率。PoolThreadCache中包含几类属性:Arena:初始化时与PoolThreadCache关联的Arena。Memory

2020-09-15 16:27:43 479

原创 rebase操作使用方法

合并历史提交我们在开发一个需求时,通常为了防止代码丢失,会进行多次提交,但是在最后push时这些提交记录就没什么用了,所以需要将历史提交进行合并。rebase命令派上了用场:# 查看提交历史,找到需要变基的提交git log PS D:\xp\doc> git logcommit 9e9cbebb97a7bff19cb592c63c91149b36ea82d3 (HEAD -> master)Author: xupan <xp545945@163.com>Date:

2020-09-15 12:57:48 1294

原创 PoolChunk内存分配分析

PoolChunck中有以下几个属性和内存分配有关:pageSize: PoolChunck中每页的大小,下面以8KB为例。maxOrder:伙伴算法中树的高度从0到maxOrder,下面以11为例。maxSubpageAllocs:叶子节点的个数,1<<11。memoryMap: 数组表示的二叉树,数组长度为1<<12。depthMap:数组表示的二叉树,数组长度为1<<12;subpages: 叶子节点对应的数组,可以继续切分为小于8KB的大小,所以使用

2020-09-15 10:46:47 368

原创 4层代理和7层代理

4层代理4层代理使用NAT技术,Nginx修改数据包里面的目标和源IP和端口,然后数据包发现目标服务,服务器处理王城后,Nginx再做一次修改,返回给请求的客户端。7层代理读取并解析HTTP请求内容,然后根据具体内容(URL、参数、Cookie、请求头),转发到相应的服务器,转发的过程是建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。4层代理和7层代理的区别理论上4层要比7层快,因为7层代理需要解析数据包的具体内容,需要消耗额外的CPU。7层代理能够获得请求的内容,更加灵活

2020-09-14 20:01:02 1222

原创 TCP报文结构

TCP报文结构端口号TCP的端口号加上IP确定一个应用进程。源端口号:通过IP和源端口号来标识报文的返回地址。目的端口号:接收方计算机上的应用程序接口。序号和确认号序号标识本报文段发送的数据组的第一个字节的序号,在TCP中每个字节一个序号。确认号表示该确认号之前的额数据正确无误的收到,确认号只有当ACK标识为1时有效。数据偏移由于TCP头部包含可选项,所以头部长度不确定,数据偏移用来标识头部的长度,最大为60字节。控制位URG:紧急指针标识。ACK:确认需要标识,为1时标

2020-09-12 14:03:10 1985

原创 fetch和pull区别

更新本地代码可以使用git fetch + git merge或者git pull两种方法。在实现上fetch和pull也有一些区别。fecthgit fetch只从远程拉最新的代码,并修改本地缓存的远程分支的commitID,git fetch之后使用git status就会看到本地分支落后远程分支这种提示。工作示意图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-na8oiNHr-1599873308075)(image/fetch示意图.png)]pullgi

2020-09-12 09:15:16 4993

原创 Redis集群

Redis集群模式主从模式主从模式是基于主从复制的特性设计的,一般是设置一个主节点、多个从节点。主从复制过程如下:主节点执行bgsave命令,生成RDB快照文件,并使用一个复制缓存区记录整个主从同步期间执行的所有写命令。主节点将快照文件发送个从节点,从节点收到后执行全量加载,加载之前会将内存中的数据清空。主节点发送缓存区的数据给从节点进行增量同步。(缓存区采用的是循环数组,所以需要设置合理的大小防止数据覆盖)哨兵模式哨兵模式在主从模式上进行了一些优化,引入一个哨兵集群来负责监控Redis集

2020-09-11 14:51:01 131

原创 SpringCloud之Hystrix

什么是服务雪崩效应服务雪崩效应的是一种因服务提供者不可用导致服务调用者不可用,并将不可用逐渐放大的现象。服务雪崩过程:服务提供者不可用。重试加大请求流量。服务调用者不可用。应对服务雪崩效应的策略:服务降级,接口调用失败就调用本地的方法返回一个默认值,防止客户端一直等待。服务熔断,接口在一个统计时间范围内的请求失败数量达到设定值就开启熔断。之后的请求就会进入提前定义好的一个熔断方法,返回错误信息。在设定时间之后尝试恢复。服务隔离 ,隔离服务之间的相互影响。服务监控:在服务发生调用时,会

2020-09-11 11:24:39 141

原创 SpringCloud之Ribbon

负载均衡负载均衡可以改善跨计算机,集群的计算资源的工作负载分布,负载平衡旨在优化资源使用,最大化吞吐量最小化响应时间并避免任何单一资源的过载。RibbonRibbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。Ribbon负载均衡策略随机策略轮训策略,默认策略。重试策略,在一个配置时间段内,当选择的Server不成功,则尝试选择一个可用的Server。Best

2020-09-11 11:24:02 112

原创 SpringCloud之Zuul

什么是网关网关是提供单一访问点,并充当多项服务的代理,网关可以做到统一接入、路由转发、过滤、流量管控、安全防护、业务隔离等功能。Zuul网关Zuul网关是Spring Cloud提供路由方案,它会根据不同的请求路径,定位到指定的微服务,并代理请求到不同的微服务接口,对外屏蔽微服务的真正接口地址。Zuul中有3个重要概念:动态路由表:Zuul支持Eureka路由和手动配置路由。路由定位:根据请求路径,Zuul使用规则及路由表达式匹配。反向代理:客户端请求到网关,网关对目标服务发送请求,拿到响应

2020-09-11 11:23:30 132

原创 SpringCloud之Eureka

服务注册发现概念在传统的系统部署中,服务运行在固定的IP和端口上,可以通过地址直接调用。但是在虚拟化或容器化的环境中,服务实例的启动和销毁很频繁,服务地址在动态变化,如果需要将请求发送到动态的服务实例上需要以下两个步骤:服务注册:存储服务的主机和端口信息。服务发现:允许其他用户发现服务注册阶段存储的信息。什么是EurekaEureka是Spring Cloud的服务注册发现组件,Eureka采用C-S架构,Eureka客户端连接到Eureka服务端,并保持心跳,这样Eureka服务端就可以监控

2020-09-11 11:22:54 177

原创 SpringCloud概念

什么是微服务微服务架构就是将单体应用程序分为多个应用程序,多个应用程序就称为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信。微服务的优点:提升开发效率,么个服务足够内聚,代码容易理解。服务可以独立测试、部署、升级、发布。提高容错性,一个服务故障不会导致整个系统瘫痪。新技术的应用,系统不会被长期限制在某个技术栈。什么是Spring CloudSpring Cloud是一系列框架的有序集合,利用Spring Boot的便利巧妙性的简化了分布式系统的基础设施开发:服务发现注册、配

2020-09-11 11:22:25 99

原创 Spring三级缓存和循环依赖

解决循环依赖一般都是通过属性注入解决循环依赖,简单来说就是先创建对象A,然后在为对象设置属性B,在初始化B时当发生循环依赖时,可以使用未完全初始化的对象A设置到B的属性。所以一个简单的实现就是将创建的半成品A先保存在缓存中,然后B依赖A时先使用缓存中的半成品A进行初始化,B正常初始化并注入到bean容器中。接着A也可以完成初始化也被加入到bean容器中并删除缓存的半成品。如果把bean容器也看做成功初始化bean的缓存,那么上面这个解决循环依赖的方案就是用了二级缓存。AOP对循环依赖的影响Spring

2020-09-10 22:32:29 203

原创 Linux驱动安装

驱动安装需要使用以下几个命令:lsmod 不确定一个驱动是否安装时使用 lsmod列出所有系统已加载驱动,使用grep进行查找。insmod 指定驱动ko文件,安装单个驱动模块。depmod 根据/lib/modules/uname -r/kernel/drivers/net/wireless/目录下的驱动生成驱动的依赖关系。modprob 加载指定驱动并且根据depmod生成的依赖文件加载它所依赖的驱动。以安装RTL8192EU无线网卡驱动为例用以上命令进行安装首先下载驱动源码RTL8

2020-09-10 09:22:27 776

原创 ThreadLocal分析

ThreadLocal提供了线程共安全共享全局变量的方法,TreadLocal对象都是是线程私有的,与普通变量不同之处在于每个线程读取的变量是相互独立的,通过get和set方法得到的都是当前线程对应的值。ThreadLocal结构ThreadLocal可以通过两种方法来设计:ThreadLocal看作一个map,其中key就是当前线程,value就是需要存储的对象。这种方案虽然能够为每个线程提供私有的变量但是ThreadLocal会在多个线程中共享,这里还需要使用线程安全的map来实现。每个线程包

2020-09-09 23:53:01 207

原创 抽象类和接口

定义抽象类:含abstract修饰符的class即为抽象类,abstract类不能创建实例,含有abstract方法的类必须定义为抽象类,抽象类中的方法不必是抽象的。抽象方法必须在子类中实现,如果子类没有实现抽象类的抽象方法,那么子类也必须是抽象类型。接口:接口是抽象类的一种特列,接口所有方法都必须是抽象的。接口中的方法默认是public abstract类型,接口中的成员变量默认是private static final类型。设计目的接口的设计目的是对类进行约束,强制要求不同的类具有不同的行为,接

2020-09-09 22:45:33 405

原创 InnoDB redo log和undo log

MySQL日志主要由3种日志,undolog, redolog binlog下面整理这三种日志的作用。redologredoLog保证事务的原子性和持久性,是InnoDB存储引擎特有的一种物理日志,负责把事务对数据库的所有修改都记录下来。redo log存储数据修改之后的值,不管事务是否提交都会记录下来。当电脑数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。在一条更新语句进行执行的时候,InnoDB引擎会把更新记录写道redo log日志中,然后更新

2020-09-09 21:15:26 259

原创 消息队列事务消息

应用背景考虑下单中锁定库存和发送消息这两个操作,锁定库存成功再发送消息到消息队列,这可能会出现锁定库存成功,但是发送消费时发送异常,就需要有回滚策略释放库存。在第一种方案的基础上,使用本地事务进行回滚。首先开启事务,锁定库存成功后发送消息到消息队列,当消息发送成功后提交事务。这时会产生消息队列发送成功,但是事务提交失败。这种跨系统的事务统称为分布式事务,分布式事务像使用数据事务那样简单方便,如果要自己实现分布式事务是一件很费事的事,目前已经有不少分布式事务的解决方案。分布式事务方案二阶段提

2020-09-09 14:43:52 414

转载 消息队列作用和选型

消息队列的作用消息队列用于不同系统和服务间的通信,在目前的大型应用中都需要依赖消息队列构建更易于维护性能更高的系统,消息队列的主要作用包括:解耦: 减少系统之间的依赖关系,例如直接将两个功能通过编码写在同一个服务中完成一个功能之后再执行第二功能的程序,或者使用RPC方式调用其他服务等待调用结果等,这些方案都将功能耦合在一起,使两个功能需要同时完成,不利用业务的扩展。异步:异步能提高系统的响应速度,减少用户等待时间。削峰限流:消息队列可以看做是一个任务队列,它能提供很大的容量,当系统流量过大时,将请

2020-09-09 14:41:09 485

原创 ubuntu20.04 使用记录

安装去github上搜索工具,下载appimage格式的文件,为文件设置可执行权限,然后启动。按照提示依次安装以下缺少的依赖apt install pythonsudo apt install libcanberra-gtk-module libcanberra-gtk3-module gconf2 gconf-service libappindicator1sudo apt-get install libssl1.1sudo apt-get install libsodium如果命令行不报错

2020-09-03 14:18:02 437

转载 Redis集群

为什么要做主从同步因为当Redis的节点挂掉后,重启数据恢复需要较长时间,会影响服务,所以要做主从复制,一个master节点可以挂接多个slave节点,当master节点挂掉时,就可以让slave节点来提供服务。Redis 主从节点是怎样通信的,传输数据是全量复制还是半增量复制Redis 怎么实现高并发Redis通过主从架构,实现读写分离,主节点负责写,并将数据同步给其他从节点,从节点负责读,从而实现高并发。Redis如何做到高可用?一个slave挂掉了不会影响程序,还会有其他的sl

2020-09-01 15:33:35 191 1

转载 Redis线程模型、原理

Redis为什么是单线程的,Redis线程模型Redis内部使用了文件事件处理器file event handle,这个文件事件处理器是单线程的,所以Redis被称为单线程的模型。它采用I/O多路复用机制监听多个socket,多个socket可能会并发产生不同的操作,每个操作对应不同的文件事件,IO多路复用机制将socket产生的事件放入一个队列中,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。文件事件处理器的结构包含4个部分:多个socket IO多路复用程序 文

2020-08-31 23:29:07 308

原创 js日期转换

手上有个工具,需要选择日期和时间以及时区,然后通过选择的日期时间和时区去服务器查询日志,因为使用工具的人可能在不同时区,服务器也可能在不同时区,所以同一使用utc时间进行传输。然后在客户端和服务器根据情况进行时区转换。于是有了下面这个根据字符串指定时区的时间函数。// time = '2020/01/01 00:00:00'// zoneOffset = -7function parse(time,zoneOffset) { localTime = new Date(time)

2020-08-31 23:25:22 314

原创 Semaphore安全释放

Semaphore应该比较熟悉了,从学习操作系统时就听过了,可以控制并行线程的数量。常用的使用方法如下public class Main { static Semaphore semaphore = new Semaphore(1); public static void doBusinessMethod(String str) { try { semaphore.acquire(1); businessMethod(s

2020-08-31 23:13:24 1109

原创 Jmockit入门应用

公司项目单元测试使用Jmockit框架,最近对我这个菜鸡进行一次培训,一下是对单元测试以及Jmockit的总结。为什么要写单元测试这个问题不用解释了,脑容量太小了多几个分支就想不过来的人,为了面子还是覆盖率高一点吧,不然后面遇到线上bug面子上过不去啊。那么为什么要使用框架写单元测试呢?蛮荒时代,我们都会用main方法进行测试,但是这种代码看着就不太舒服,写个测试用例就得修改代码,这谁能保证有没有破坏分子利用补单元测试的机会搞破坏呢?使用框架写单元测试的好处主要就是以下两点:生产代码和测试代码隔离

2020-08-30 18:30:27 466

原创 bootstrap日期选择器在vue.js中的使用

bootstrap中比较用的日期选择器插件是bootstrap-datetimepicker,默认样式如下:下面先给出在页面中实际使用的例子:<div id="app"> <div class="form-group col-xs-4"> <label class="control-label col-xs-3">startTime:</label> <div class="col-xs-9">

2020-08-26 17:51:27 1437

原创 cherry-pick

在多分支开发时,需要合并其他分支的代码时会选择使用merge,merge是将整个分支合入到当前分支,如果仅仅需要某个分支中部分提交那么就可以使用cherry-pick。cherry-pick能够将指定的某个提交或某些提交合并到当前分支。具体用法如下:合并一个提交git switch branch/A# 查看branch/A分支中需要的提交hash,假设为 78c81001fe518c07e8515936663b5d5603e0b3d8git log git switch branch/B

2020-08-25 13:35:00 381

原创 自定义注解扫描

扫描自定义注解有多种方式,这里通过实现ImportBeanDefinitionRegistrar类来进行自定义注解的扫描,并将其注入IOC容器中。ImportBeanDefinitionRegistrar类本身只能通过@Import方式进行注入,所以先来实现一个注解方便使用,类似@Enablexxx。/** * 扫描指定包下的client */@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Import(Annotat

2020-08-16 13:55:24 3219

空空如也

空空如也

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

TA关注的人

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