自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 依赖倒置到底倒了什么

职责不在于提供方,而要需求方去想办法,但因为要符合依赖倒置原则,如果低层不能满足高层,就要由低层去想方设法满足高层,到时候满足不了业务要求,责任不在于高层,而在于低层。要理解倒置,必须得明白什么是正置,正置是程序中只能用具体的实现,不是依赖抽象。但在面向对象中有了接口interface关键字就可以做到只依赖抽象,比如人吃水果,在面向对象中Person.eat(Fruit)直接体现了依赖一个脱离具体的、抽象的水果,颠倒了关于依赖的认知(可以找到既不是梨又不是苹果的一般的水果去依赖)。

2023-08-30 23:59:13 61

原创 违背原则才能写好代码(一)

当然我们可以在中介类里面再封装其他中介类,一层层封装下去,但这造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系。也就是一个类只负责一个功能,但我们的业务场景往往是需要多个功能配合使用的,这些功能粒度如果拆的很细,我们为了完成业务功能,就必须要对很多的类有了解。最后一个类究竟拆到什么程度才算单一,往往是把握不住的,里面的水很深,如果为了满足这个原则,强行去考虑,只会适得其反,捡了芝麻丢了西瓜。如果为了开闭,而要违背原则,我们也不得不去违背,否则就本末倒置了。

2023-08-30 23:58:06 146

原创 剑指 Offer 56 - II. 数组中数字出现的次数 II

题目地址https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4示例 2:输入:nums = [9,1,7,9,7,9,7]输出:1解法位运算解法,网上很多都是直接贴代码或者三两句解释,根本不能理解原理。楼主尝试详细解释下,希望小白也能看懂

2022-05-15 19:42:43 147

原创 从TCP到HTTPS原理之HTTP与HTTPS(二)

http是基于tcp协议的应用协议,意思就是通过tcp建立连接后后面发送的消息是http格式的, 已打电话为例, 基于电话线我们可以用汉语,英语,日语沟通。同样的基于tcp协议我们可以用https,fps,等进行沟通。https就是http+ssl。就是安全版的http。HTTP直接看抓包结果可以看到发送什么消息都可以直接明文看到,响应消息也可以直接看到建立tcp连接后直接发送消息没有安全性。HTTPShttps建立tcp连接后还有一套加密解密过程先看下抓包可以看到同样的请求多了很

2021-12-11 18:44:36 2434 1

原创 从TCP到HTTPS原理之TCP(一)

抓包来理解tcp协议

2021-12-11 18:22:55 2228 1

原创 redis主从复制原理

Redis主从同步有2种,SYNC和PSYNC, PSYNC是优化版的SYNC,2.8版本才有,废话不多说直接看图!SYNC的原理SYNC有缺点,就是掉线后的同步,需要进行全量同步,没有增量同步功能。SYNC缺点1.生成RDB文件,将耗费主服务器CPU、内存和磁盘I/O资源2.RDB文件发送给从服务器,耗费主网络资源,对主响应命令请求的时间产生影响。3.从服务器载入RDB文件,在载入期间,因为阻塞而没办法处理命令请求。4.当掉线后即便至少了很少数据也需要全量同步。因为有以上缺陷所以

2021-07-30 00:13:27 122

原创 多线程hashmap死循环分析

这边分析的是JDK1.7版本的hashmap核心代码是这 void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { while(null != e) { Entry<K,V> next = e.next;

2021-07-26 23:48:55 127

原创 解决RocketMQ-console the producer group[] not exist BROKER

使用后台报the producer group[] not exist,这是因为从网上copy的配置配置了groupname,解决办法是加上条件

2021-07-18 03:23:01 4037

原创 3张图搞懂mysql事务隔离级别以及MVCC

首先先理清事务,事务隔离级别,事务传播的概念。事务:一组sql要么都失败,要么都成功。事务隔离级别:事务与事务之间的可见性。有读未提交,读到别人尚未提交的数据。读已提交只能读取别人已提交的事务。可重复读,只能读取别人已提交的事务,并且这个已提交的事务,它开启的时间要小于当前事务开始的时间。序列化,只能有一个事务在运行。事务传播:如果有事务了,后面创建事务的行为。比如可以加入前面事务,或者新建,或者直接异常等等。MVCC:中文名叫多版本并发控制是在可重复读的事务级别上,mysql为了提高并发性而使用的

2021-04-24 12:43:38 104

原创 快速入门VUE

VUE是js框架,类似我们java使用的springboot,让你开发更快速。引入VUE,类似maven引入springboot。他的几个常用功能v-modelinput的内容跟vue中的变量双向绑定,input变化变量跟这变化,变量变化input也会变化v-for:类似foreach 遍历数组的,可以用v-text填充 或者使用{{data2}}v-modelinput的内容跟vue中的变量双向绑定,input变化变量跟这变化,变量变化input也会变化v-bin

2021-03-21 23:57:50 98

原创 三张图片理清JVM内存布局和GC算法

内存布局以及控制他们的命令GC算法

2021-02-17 20:59:50 110

原创 一张图片看懂Java对象头以及组成

需要特别注意当一个对象计算过hashcode他就无法进入偏向锁。当一个对象是偏向锁时我们计算hashcode它会变成重量级锁。

2021-02-16 19:00:02 219 2

原创 数据库为什么推荐小表驱动大表

小表驱动大表,跟大表驱动小表有区别吗?不都是n*m级别吗?我们来看个例子。小表A 有id 1,2,3,4,5。大表B 有id 1~100.小表驱动大表拿到A表的id去B表关联,匹配5次就结束了。大表驱动小表 ,6~100这些id其实都是匹配不到的,但还是会跟A表匹配。匹配了100次。伪码:小表A Set idA;大表B Set idB;小表驱动大表://遍历A表的idfor ( ida: idA ){//循环5次就ok了//如果可以匹配到,索引是B+树匹配很快的return

2021-01-16 14:04:16 1909

原创 三张图片搞懂分布式事务常用方案

两阶段提交(XA协议)TCC方案最终一致性

2020-11-19 10:46:31 112

原创 一张图看懂mysql执行流程

这是update执行流程这是select执行流程

2020-11-18 23:06:36 222

原创 一张图看懂springboot自动装配原理

自动就是我们在引入第三方依赖时可以自动装载这些依赖包的bean,如果用原始的xml我们需要一大堆第三方的类.boot会去读取每个依赖工程下面的META-INF/spring.factories(约定俗成的目录)里面指定的类,将他们装载成bean。装配一般就是装载配置类相关的,比如默认的json解析器,数据库配置等,...

2020-11-01 21:16:37 274 1

原创 java转c++需要注意的几个点

1. 左值就是可以改变数据的变量,可以出现在左边或右边,出现在右边就变成右值了。 右值只能出现在右边,consts即不是左值也不是右值。2. 内联函数就是短而小的函数,在函数调用的地方直接替换成代码,减少函数调用成本。函数声名成inline int max(int a,int b),或者直接宏定义#define MAX(a,b) ((a)>(b)?(a):(b)).3. typedef相当于对数据类型取别名,typedef int INT; INT a就相当于int a;4. extern就

2020-09-16 23:07:09 548

原创 HTTPS之非对称加密

对称加密即加密和解密密钥是同一个。比如我发给 good给你,然后我的密钥是1,算法是每个字母+1,我发给你的信息变成hppe。你收到信息后密钥也是1,算法就是字母-1,解密后变成good。 问题是我们要怎么沟通密钥和加密解密算法呢,可以当面给你比较安全,但是麻烦,如果直接网上发消息很可能被其他人窃听了,为了解决这个问题就出现了非对称加密,RSA是他的一个实现。非对称加密有以下特点:有两把钥匙公钥和私钥,公钥就是可以公开的,私钥保留在自己这。公钥加密的东西私钥可以解密,私钥加密的东西公钥可以解密(涉及到数

2020-09-04 20:52:45 410

原创 aop几个概念理解

通知:前置通知,后置通知,异常通知等。连接点:是切方法还是切异常。切点:切什么样的方法(异常)切面:通知和切点所在的类。织入:创建目标代理的过程。

2020-09-04 16:28:45 135

原创 SpringBoot常用技巧

如何扫描这个启动类包外的包?@ComponentScan(basePackages = {“com”}) com就是我们要扫描的包如果一个接口有两个实现类在使用@Autowired注入的时候改怎么做?要注入的成员变量名跟你要的beanName一样.1.@AutowiredAnimal cat;就会注入Cat了不会注入Dog.2.如果有Cat和Dog,优先注入Cat,就在Cat加@Primary@Primarypublic class Cat implement Animal {} 这..

2020-09-03 23:55:29 228

原创 一张图片搞懂java的引用类型以及ThreadLocal为什么会导致内存泄露

java4种类型引用强,软,弱,虚。强引用:我们平常的引用都是这种类型,gc后,即便内存不够也不会被回收。软引用:用法SoftReference<类> sr; sr.get();在gc后如果内存还是不够便会回收软引用。一般我们的缓存value可以用软引用保证。弱引用:WeakReference<类> wr;wr.get();不管内存够不够,每次gc都会回收。虚引用:这个引用跟前面3个不太像,PhantomReference<类> pr;ReferenceQueue

2020-09-02 16:46:09 153

原创 类的加载机制

类的生命周期包括加载,验证,准备,解析,初始化,使用,卸载。加载:把.class文件加载进内存,生产class对象。验证:检验class文件是否合规,比如魔数是不是cafebaby。

2020-09-02 11:23:06 88

原创 redis持久化过程中可以对外服务吗

https://www.csdn.net/gather_2f/MtjaggzsNTE1MTYtYmxvZwO0O0OO0O0O.html持久化有两种方式:rdb和aof。rdb就是生成某个时间点快照,有异步bgsave和同步save,同步的话肯定不能对外服务了,异步是通过fork子进程完成的,需要注意的是,在异步的时候,数据可能发生变化,那redis是如何处理的呢?redis并不是直接复制一份进行复制,redis运用写时复制cow思想,即一开始redis和子进程都指向同一个数据,当某个key改变时red

2020-09-01 19:10:25 551

原创 jvm实用命令

jmap -heap PID查看内存区域分布以及当前使用情况,用来分析启动参数是否合理。jmap -histo:live PID查看对象占用内存大小,用来分析可能存在内存泄露的地方pmap -x PID在最前面可以看到完整的启动命令,用top命令可能显示不全...

2020-09-01 11:51:32 81

原创 java中级程序员的几个面试题

1.G1有哪几种GC?什么时候出发full gc?参考这篇G1旨在取代CMS,一个特点就是可以指定STW时间,参数是-xx:MaxGCPauseMillis=100。G1有两种回收算法:年轻代是复制算法,老年代是标记清除算法。G1采用分区思路,分区有大有小,需要注意的是年轻代,老年代并不是物理上完全区分的,而是在分区里面任意占用。G1有两种GC,Young GC和oldGC,当所有eden分区满了就会进行Young GC,存活下来的都拷贝到Survivor区,并根据年龄晋升到老年代(这个特点跟具

2020-08-31 22:39:08 1331

原创 RPC与HTTP对比

RPC是远程服务调用,一般是服务方把消费者jar包给你,然后使用这个jar的代理相关方法,会返回一个接口给你,后面你要什么服务,就跟直接调用这个的方法即可,jar会帮你处理的。HTTP是没什么好说的,大家都懂。RPC跟HTTP都是通过TCP进行通讯,然后RPC一般是自己定义一套传输协议,在传送数据的时候涉及到序列化,所以不同的框架是无法进行兼容的,因为数据格式不同就无法解析了。 HTTP数据一般都是用json进行传送,大家格式都一样,所以不同的编程语言,框架都是兼容的,都能识别。RPC一个优点就是知道

2020-08-30 17:14:37 980

原创 springboot启动流程

mai方法实例化应用上下文初始化类实例化应用事件监听(spring实现java事件接口),加载应用运行监听类,通过start通知所有应用运行监听实现类。创建和配置当前使用的环境输出banner是否是web容器一系列故障分析类初始化应用上下文调用它的refresh完成ioc,并调用里面实现了各种aware接口的bean的方法。运行命令行运行类和应用运行类spring应用运行监听类的finish方法...

2020-08-28 11:25:33 74

原创 spi与双亲委派

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码

2020-08-28 00:00:31 256

原创 mysql存储引擎区别

innodb:支持事务,行级锁,btree,full-text索引,不支持hash索引。myisam:不支持事务,支持表级锁,btree,full-text索引,不支持hash索引。memory

2020-08-27 16:27:56 63

原创 小白入门springcloud组件概念

微服务其实就是讲原来一个大服务拆分成多个小服务分成多个应用,比如原来用户积分,跟用户订单在一个java项目中,后来代码膨胀不好维护了,便拆了两个java项目。原来一个项目调用是直接用方法调用,现在是两个不同的jar包了不能直接调用了,要调用有两种实现方法,意思是RPC调用如dubbo,一种是http调用如springcloud。先讲下springcloud。要调用对方至少得知道对方地址是什么,所以有Eureka注册中心,每个jar报将自己有哪些服务,以及地址是什么注册到Eureka,jar包通过读取eur

2020-08-25 20:37:30 108

原创 java静态代理和动态代理基础知识

静态代理:就是自己实现代理类,有这个代理类源码,主要思路就是代理类里面有个被代理类的成员变量,并且需要跟它实现同一个接口,这样才能知道需要代理哪些方法,然后在对应的方法下进行编写。客户端在使用的时候是接触到代理类,调用代理类的方法。然而,代理的应用一般是第三方应用编写代理类,由开发人员实现被代理类,如果是使用静态代理,这显然是不能实现的,所以真正广泛应用的是动态代理。动态代理:前面说了需要实现同一个接口才能知道有哪些方法,但其实我们可以直接传方法进来啊,然后调用的时候直接调用这个方法对象即可,即运用反射

2020-08-24 23:42:15 97

原创 jvm内存分布基础知识

jvm分成5个部分:虚拟机栈:存放调用java方法的相关数据,如局部变量,返回地址。本地方法栈:存放调用本地方法的相关数据,如局部变量,返回地址。程序计数器:存放当前线程运行到哪一行。堆:存放对象的。只有这个区域才有CG。直接内存:NIO中的DirectBuffer,直接使用的物理内存,即大小受本机总内存限制。方法区:存放类信息,静态变量,常量等。堆是垃圾回收的地方,又分成2个部分年轻代和老年代。年轻代又分成2个部分1个Eden区和2个survivor区。 新建的对象会创建在eden区,然后

2020-08-23 20:44:47 147

原创 压在redis身上的三座大山

三座大山分别是缓存穿透,缓存击穿,缓存雪崩缓存穿透:查询参数是无效的key,这个key在redis没有,然后取数据库查也查不到,导致无用查询。解决方法有两个 1是value设置成null。2是使用布隆过滤器,布隆过滤器可以看出一个数组,然后我们对key进行多次不同hash运算,然后对长度取模,对应位置标记成1,下次有key来的时候先判断这个布隆过滤器对应的下标是不是都是1,如果不是就是没有的key。缓存击穿:热点key失效了,然后突然有很高的并发来查询这个key,导致很多查询跑到数据库去。解决方法是 对

2020-08-23 17:51:26 144

原创 mysql查询慢排查

查询慢分两种一种是偶尔性慢,一种是总是慢。针对总是慢主要是加索引,可以解决90%的问题,然后是优化sql,而且需要注意的是,加了索引还要让索引生效,比如没有遵守最左前缀原则,或者对列进行函数操作。还有一种是mysql在查询的时候认为走索引性能更差,也就是误判了,需要我们在sql上强制走索引select * from t force index(column).偶尔慢:可能的原因是数据库并发高,其他线程锁行或者锁表。 或者是redolog满了,需要刷新到磁盘,这种可以通过flush相关参数进行优化。

2020-08-23 17:12:24 224

原创 java进程cpu100%如何定位到具体的代码

查找cpu占有率的PID。 输入命令 top -c ,然后按p(按cpu使用率排序)找到排名第一的java进程,比如它的pid 是 pid1.查看这个pid下哪个线程占用率。top -Hp pid1 ,按p 找到排名第一的线程id,比如是 pid2导出线程运行情况 , jstack -l pid1 > stack.infocat log.log |grep ‘16进制的 pid2’ -C 8。总结:top -c ,ptop -Hp pid1jstack -l pid1 &.

2020-08-23 15:46:17 278

原创 synchronized底层原理简单说明

synchronized本质是获取一个独占可重入的对象。java对象由三部分组成:对象头,实例数据,对齐填充。 其中对象头记录了这个对象所指向的C++monitor对象,这个monitor记录了哪个线程持有锁,以及一些阻塞队列等。也就是说如果 synchronized(lock) lock对象的对象头有个指针 指向了 monitor,这个是一一对应的关系。synchronized底层指令是1个monitorenter和2个monitorexit。 是因为除了正常退出,还有出现异常也要退出,所以有2个退

2020-08-22 21:37:34 287

原创 java偏向锁以及它的升级

先科普一下:我们经常说悲观锁,乐观锁,公平锁,非公平锁,读写锁等等,这些概念并不是对立的关系,而是从不同角度看待对锁的分类,比如synchronized,既是非公平锁又是可重入锁。偏向锁的出现的背景:jvm作者研究发现,大部分情况锁不仅不存在竞争,而且总是由同一个线程获得。为了减少获取的代价,引入了偏向锁。获取偏向锁:线程1进入同步,在锁的对象的对象头(理解成对象的信息表)有个是否是偏向锁,以及偏向的线程id。如果偏向的线程id不是自己,线程1就用CAS操作替换成自己,成功就获取到锁了,退出同步块的时候

2020-08-15 00:37:15 223

原创 动态规划之编辑距离,简单理解

编辑距离用于计算两个字符串的差距。即字符串s1经过几步操作可以变成字符串s2,操作有增删改。比如 s1=abc. s2=aecf。 他们的编辑距离是2 ,把s1的b改成e,然后是s1增加f。需要2步。dp[i][ j]=s1[0…i] 和 s2[0…j] 的最小编辑距离基本思路是 ,s1下标i对应的s2下标j的字符是否相等。相等不用动,dp[i][j]=dp[i-1][j-1]不等有3种操作。增加操作:dp[i][j]=dp[i][j-1]+1; 如果[0…i]已经转成[0…j-1]的情况下,要

2020-08-13 22:55:08 107

原创 萌新也能看得懂之mysql索引底层原理

索引是什么?索引就是一种数据结构,目的是为了加快查询速度。既然是为了加快查找的数据结构,那就有以下几种选择。1.hash索引。2.树。选择hash索引:hash索引虽然查找是o(1)级别的,但是不能进行范围查询。比如要查找年龄20~30的,只能进行全表扫描,也就是对于范围查找索引失效,会进行全表扫描。选择树结构:查找算法如果是有序的就可以选择二分法查找,为了使用二分法的数据结构有树。树的选择方案很多,有二叉树,b树,红黑树等。mysql默认使用的是B+树。二叉树,红黑树有一个缺点就是数据量大的时候

2020-08-09 14:46:26 81

原创 萌新也能看得懂之mysql事务实现原理

undo文件:在操作更新到磁盘前把旧值先写到undo日志中。undo作用用于回滚。A旧值200,B旧值100,开启的事务是T1,圆圈数字开头的是undo日志内容开启事务①T1,开始②T1,A,200执行A=A-50③T1,B,100执行B=B+50把A写入磁盘把B写入磁盘④T1,提交如果在执行把B写入磁盘的时候断电(或者回滚),读取undo日志发现没有“T1,提交”执行A=200,B=100,这样就能回到以前的状态了。redo文件:把新的值记录在redo日志中redo作用用于

2020-08-07 00:06:57 81

空空如也

空空如也

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

TA关注的人

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