自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java 常见的设计原则

在我写代码时,一般的步骤为:类->接口->方法,即首先想有一个实体,对实体的行为进行抽象,根据不同情况对抽象行为进行具体实现。在这个过程中,我们遵从一定的规范,才能使得这个实体活过来,并按照自己的意识活动。对此:类的规范就有迪米特法则、合成复用原则,里氏替换原则,让手为手,衣服为身外物;里氏替换原则则是父类可以做的,子类都可以做。对于接口的规范就有接口隔离原则、依赖倒置原则,接口隔离就是多余的东西不要,比如眼睛是用来看的没有吃饭的功能,就眼睛有吃饭功能的实现。

2024-09-15 12:57:28 857

原创 sprng bean的装配细节

用进行赋空值,idea高版本会自动处理空值,低版本如果没有处理会报错。,例如 ""等,用可以用map和entry标签进行组合解决。

2024-08-17 22:43:37 212

原创 Nacos的CP处理数据一致性算法

集群里,主要理解的东西就是一个数据同步的问题,也就是数据一致性问题,主要就是CAP理论,也就是一致性、可用性、网络分区。一致性:你读取的是最新的写或者是错误可用性:每一次请求都可以收到一个结果网络分区:就是可能会有一个网络的故障在现实中,网络是一定要允许网络故障的存在,所以这个P是一定存在的,所以对这个A、C做一个取舍,比如说我们选择的是一个cp架构,也就是说,我们要保证一致性+网络故障存在。

2024-08-16 15:31:42 897

原创 springboot核心源码 -启动类的run方法

/将spi的实例方法进行回调那这个spi的实例方法回调的应用场景是什么呢:如果我们想要在spring #refresh刷新之前做一些事情,那么就可以对初始化器进行实现,也就相当于对spring进行了扩展。通过这个我们可以自定义自己的初始化器。

2024-08-16 15:08:32 528

原创 mysql的基本框架

解析我们的sql语句,判断语句是否符合我们sql的语法以及后续的权限检测。根据你电脑的cpu来决定你怎么优化,优化的方式有很多,可以自己去设置,像一些索引下推、子查询、链接管理。我们的sql是一个一个简单的语句,我要知道这个语句是否正确,我需要一个一个的单纯去检查。memorv,我所有的数据保存在内存里,操作非常快,但是没法保证我数据的一个持久性。我去执行的一些命令,比如说我是做BinLog的同步,比如我是睡眠状态、还是查询状态。Myisam ,更多的是只读的场景,或者读多的场景。当前线程的一些状态,

2024-08-16 15:01:19 214

原创 InnoDB存储引擎磁盘结构

就是我决定这个行数据是怎样存储的,它是以内存优先,还是以CPU优先,它是节省内存还是cpu的消耗。这些表默认都会放到一个系统文件下面,如果一个系统文件放不下,我可能还会指定一些系统文件,所以这是由系统文件去决定的。指定哪些表到哪个表空间,这个表空间是通用表空间,我可以创建表空间,但创建表的时候可以指定创建的表放在那个表空间下。一般一个行不能超过一个页的一半,在页里面,为了更好管理页,又有一个区的概念,叫extent(区),区是属于一个页的分组,在一个区里面最少能存储64的page。

2024-08-16 14:59:28 295

原创 mysql InnoDB内存加载、管理机制、执行流程

交互就是我的内存怎么从磁盘中拿数据,内存改了后怎么同步到磁盘,这必须有个交互的单位。最小的交互单位是page页。当客户端与连接层建立连接,然后发起一个sql语句的时候,服务层会经过以下几个点,首先经过解析器,解析器就是要知道客户端发送的sql语句是否正确,它分为词法解析和语法解析,经过语法解析后就进行预处理,预处理有两个作用,第一个就是减少了解析器的解析次数,第二个是防止sql注入。

2024-08-16 14:56:34 1476

原创 MYSQL 千万数据的分页优化--count、limit、排序、分组优化

可以在系统数据库mysql库下的slow_log下查询慢查询的记录,通过记录也可以在sql_text里查看执行的sql语句,但是保存的二进制,如果想看的话,可以将它转码一下。如果让order by 的字段做索引,那么排序流程直接可以在索引数完成,如果排序的字段不走索引,整个排序必须先把数据放到内存,在内存里面实现排序。慢日志查询,就是超过long_query_time秒数的一个执行,以及最少超过min_examined_row_limit的行数被查询到,才会进入到慢查询。以上是官网的建议,对此总结为。

2024-08-16 14:52:24 829

原创 Mysql主从同步载体Binary Log

为了提高数据库的高可用,可以部署主从、多主多从、单主多从,去做到读写分离,写库一般只负责写,读库更多承担读的请求,所以读库一般不会去写数据,更多都是主库同步过来。那到底是怎么同步呢,同步数据,数据是需要有一个载体,比如说,在redis里面有RDB文件,而在mysql里面的载体就是Binary Log,简称BinLog,是一个二进制日志。BinLog 包含了事件、数据修改、表创建,也包含它即将发生的一些事情。

2024-08-16 14:47:22 256

原创 mysql 数据一致性问题方案(MVCC、LBCC)

在innodb里面,在并发问题下有两种解决一致性问题的方案MVCC和LBCC。非锁定一致性读取,解决读取数据时候的数据一致性问题。不需要对数据进行加锁,锁定一致性读取从大的方面来讲,又分为共享锁、排他锁。共享锁和共享锁是不互斥的,但是共享锁和排他锁是互斥的。在我们修改数据的时候默认加一个排他锁,或者手动添加也可以。具体锁哪些数据,又分为三个记录锁、间隙锁、临键锁。记录锁:锁索引树的某条数据,在索引树的节点节点添加记录锁

2024-08-16 14:45:29 933

原创 SpringMVC拦截器详情与案例

Spring MVC中的拦截器主要用于拦截用户请求并做出相对应事务处理,拦截器的应用场景有权限验证、记录请求信息的日志、判断用户是否登录。拦截器的定义。

2024-08-16 14:37:30 350

原创 Spring AOP切入点表达式与切面优先级别

Order注解指定切面的优先级,值越小优先级越高,优先级越高越先执行。在AOP编程中,@Order可以用于控制切面的执行顺序;

2024-08-16 14:33:40 272

原创 详细解读Spring Aop实现原理和案例

代理对象概念:对目标对象进行拦截,加入新的功能,目标对象和新增功能组成了代理对象。spring会监控切入点方法的执行,一旦监控到切入点方法被运行了,就动态地创建目标对象的代理对象。AOP支持的动态代理主要有两种:JDK代理和CGLib代码。

2024-08-16 14:31:05 324

原创 JVM参数命令及工具

会发现当前的Eden、S0、S1的大小不是设定号的比例,-XX:-UseAdaptiveSizePlicy 禁用了也没用,因为jvm中的垃圾回收器会根据当前业务代码的对象大小,动态调整Eden、S0和S1的大小。除了jdk自己带的视图化工具外,还可以用arthas,在生产环境中,可以监视。那怎么获取日志文件呢,可以用-XX:-PrintGC打印出日志内容,在线网站。(2)Eden区小一些,因为S区需要更多的空间,没有回收掉,也没有到达。垃圾收集一定也有日志文件,而且不同的收集器会有不同类型文件。

2024-08-16 14:25:44 304

原创 JVM常见的垃圾收集器

而在G1中,也有完整的内存空间,但是新老年代不是连续的,不需要像以前一样在物理上连续,只需要在逻辑上连续。其中初始标记、并发标记、最终标记、筛选标记都是扫描操作,找出不可达对象作为垃圾对象,并且开始清理,清理完成后,还有一个copy操作,主要为了下次进行。CMS是追求停顿时间的,目标域是老年代,也是一款老年代收集器,它会尝试最小化停顿时间,不会进行拷贝或压缩我们的对象,就意味着有空间碎片的问题。垃圾优先:这些对象region中有存活的对象,也有垃圾对象,那意思就是在回收的时候会有一个优先级。

2024-08-15 19:01:51 990

原创 JVM内存模型-运行时数据区

vm运行时数据区分为5个区域,其中又分为进程生命周期、线程生命周期这两个维度,进程生命周期包含方法区、堆,线程生命周期分为java虚拟机栈、PC Register 、本地方法栈。进程说明里面的数据会被当前所有的线程共享,会存在线程安全。每个线程都有自己的数据,不存在线程安全问题。数据结构:数据保存的结构算法:数据该如何进行取。

2024-08-15 18:41:04 341

原创 JVM-类加载机制

在一般情况下,启动项目,是通过磁盘exe文件 ->启动内存 ->在内存里加载数据 ->调用cpu执行相关任务。对于class文件而言也是一样的,在内存条里给java分配一个空间(),将class文件信息加载到内存空间中。类加载过程主要分为三个阶段:装载、链接、初始化。

2024-08-15 18:38:14 381

原创 JVM调优-代码层面与非代码层面

它就采用默认的容量大小,但超过它的阈值时就会扩容,但是还有剩下的容量空间没有使用,就会被浪费了。在开发过程中,例如在for循环,如果把对象放到for循环中,表面上,java代码对象并没有变多,但是在class文件里面对应的对象就变多了。对象清理,比如说 集合的清理,user.clear(),它并没有将内存清空,而是将元素清空,正确的方式是users =null;停顿时间:堆内存变大后,空间大,放得更多的对象,需要处理的对象也变多,比之前更加耗时。之所以停顿时间那么少,是因为在筛选回收的环节。

2024-08-15 18:28:25 669

原创 redis集群如何主从之间数据一致性

redis集群有三种,主从、sentine哨兵、cluster。

2024-08-15 18:19:33 377

原创 redis缓存雪崩、穿透、击穿问题

缓存穿透就是恶意攻击,就是我查询的key,redis没有,db也没有。在频繁的并发条件下,每次请求都会走DB,最好的办法就是找运维,把ip封掉,因为它就是在做恶意攻击。就是相当于redis挂了,所有请求都会访问DB,不走缓存。就是redis大量的数据同时过期或者说失效,这时候并发很高,全部达到DB。单个key,如果过期的时候,大量的并发请求访问这个key,这个时候也会全部打到DB中,这个也很好解决,就是加锁,但一般不加锁。做一个标记,在不在,没有真实的数据,可以用bitmap。

2024-08-15 18:16:59 117

原创 Redis的持久化RDB、AOF

由于数据都是放在内存操作的,那么假如我重启的话,数据就没了。所以我需要一个持久化方式,将数据放在磁盘中,那么我重启的时候,可以从磁盘加载到内存里,所以操作还是内存操作,保证redis的高可用,保证数据是不会丢失了。

2024-08-15 18:14:28 262

原创 Redis的分布式锁源码分析-基于redission

我们的一些互斥资源,不能并行执行 需要一个东西来保证串行执行,这就是锁的目的。分布式锁,就是不管是在哪条机器上并发执行,都可以锁住。在集群环境下,锁不能放在单机,而是放在第三方,这样保证你都是只有一台机器上在执行,不管在哪台机器都会生效的。这个锁是一定独立于我们业务服务的。对于分布式锁,要满足三点:1、有一个标识,判断是否有锁。redis本身就是一个k-v结构,可以用k作为表示,判断这个v存不存在2、可见性,这个标识是所有请求可见的3、原子性。

2024-08-15 18:07:54 359

原创 Redis常用数据类型以及使用场景案例

redis常用的类型有String、List、Set、Hash、sorted Set。不同类型存储的value值大小是不一样的,比如Stirng是512M。redis的缓存场景:用户发送请求给服务器,首先是在Redis里面查询数据,如果redis里面没有数据,那么会到数据库里面查询数据,将查询结果回写到redis里面,并且将结果返回给用户.springboot是集成redis的,。

2024-08-15 17:59:51 1649

原创 ThreadLocal场景、原理源码分析

threadLocal就是每个线程维护一个自己的资源,做到线程隔离。源码分析,分析怎么get、怎么set值的。

2024-08-15 17:52:22 467

原创 CPU协议:深入理解MESI

在发生并发的时候,主要需要考虑三个方面:原子性、有序性、可见性。我在做某件事情的时候,不允许插队或者不允许修改与这件事情相关的东西。如何保证原子性呢,把并行改为串行就可以,加锁。在多线程的情况下,代码的执行顺序可能会发生变更在单线程的时候,不会影响最终结果线程启动后,对线程外改的变量。对于线程不可见。

2024-08-15 17:47:27 478

原创 Springboot四种异常处理方式-url拦截处理、@ExceptionHandle、SimpleMappingExceptionResolver、HandlerExceptionResolver

Springboot四种异常处理方式-url拦截处理、@ExceptionHandle、SimpleMappingExceptionResolver、HandlerExceptionResolver

2024-08-15 17:41:17 184

原创 synchoronized锁升级

锁升级的目的是为了提高锁的性能。如果存在很多有锁的线程操作,一直会阻塞唤醒,频繁的阻塞唤醒也是需要消耗性能的。重量级锁,只要有人在做就会进行等待。

2024-08-15 17:33:08 209

原创 Hashmap源码详解

hashMap的存储流程这包含哈希冲突、解决冲突、扩容、数据结构、hashMap是怎么扩容的在hashMap里面,有两种场景会进行扩容。第一种就是,在初始化化时,如果HashMap的构造方法你没有指定参数,那么容器初始容量为0,在第一次put方法时,会进行一次扩容,扩容的默认容量大小为16。如果构造方法指定参数,那么HashMap会根据这个参数进行初始化容量,容量大小要是接近这个参数的2的幂,也就是说传入的参数是7,hashMap并不会创建容量为7的,而是会创建容量大小为8。

2024-08-15 17:31:29 471

原创 java 并发 ReentrantLock源码解析

锁的作用在于将原来的并行改为串行,除了synchronized可以加锁,还可以用ReentrantLock加锁保证线程安全。思路:标记,通过这个标记来判断是否有线程在执行,如果没有,线程能够执行并且把标记改为在执行,改这个标记必须满足保证原子性、可见性,保证安全性。其它线程如果判断这个标记有线程在执行,那么我要么排队(lock),要么返回没有拿到锁(tryLock)。模拟源码:一个方法加锁(lock),执行完成后,释放锁(unlock);

2024-08-15 17:27:07 383

空空如也

空空如也

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

TA关注的人

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