自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于mysql认识1.1

本文主要是关于mysql的一些个人理解,如果文中用词或者理解方面出现问题,欢迎指出。此文旨在分享我对于mysql的整一些个人理解,对于细节方面不会去深究,若有名词或者理解方面的问题,欢迎指出Mysql须知:在此是默认读者熟悉了sql的一些概念,在此只是记录平时经常用到的一些sql以及背后的原理mysql的执行顺序select[distinct]fromjoin(如left join)onwheregroup byhavingunionorder bylimitMysql的执行顺序

2021-08-02 20:23:55 206

原创 记一次SSLHandshakeException报错记录

在启动项目的时候报错javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)原因是引入了druid数据源启动的时候没错,访问项目的时候报错记录以下解决办法:找到自己JAVA文件位置进入jre/lib/security,编辑java.securityfind jdk.tls.disabledAlgorithms

2021-07-31 18:30:57 290

原创 分布式理论

分布式理论CAP 理论CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。CAP,由于分布式实际上不可能保证分区容错性,也就是说会有网络波动或者服务宕机的可能,所以P必须选择,那么就不可能保证P的情况下去保证CA,所以如果业务要求强一致就选CP等等BASE 理论BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Co

2021-07-31 18:30:08 152

原创 什么是CAS机制

什么是CAS机制我们先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次。最终输出的count结果一定是200吗?因为这段代码是非线程安全的,所以最终的自增结果很可能会小于200。我们再加上synchronized同步锁,再来看一下。加了同步锁之后,count自增的操作变成了原子性操作,所以最终输出一定是count=200,代码实现了线程安全。虽然synchronized确保了线程安全,但是在某些情况下,这并不是一个最有的选择。关键在于性能问题。synchronized

2021-07-30 14:56:13 217

原创 SpringBoot自动配置

SpringBoot自动配置通过启动类的@SpringBootApplication–>@EnableAutoConfiguration–>@Import({AutoConfigurationImportSelector.class})–>selectImports() List configurations = this.getCandidateConfigurations(annotationMetadata, attributes)–>getCandidateC

2021-07-30 14:54:55 99

原创 SpringBoot启动分析

SpringBoot启动分析1)IOC之容器启动阶段这个阶段主要会进行:加载配置文件并解析,然后将解析后的数据封装为BeanDefinition实例,最后把这些保存了bean定义的BeanDefinition,注册到相应的BeanDefinitionRegistry,这样容器的启动工作就完成了。配置文件:类似的有xml配置文件还有自动配置类2)IOC之容器实例化阶段当某个请求通过BeanFactory的getBean方法请求某个对象,或者因为依赖关系容器需要隐式的调用getBean时,就会触发第二

2021-07-30 14:54:28 131

原创 线程池详解

线程池为什么要使用线程池?池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就

2021-07-30 14:52:48 472

原创 redis解析

redisredis是单线程执行的IO多路复用模型具体实现是redis基于Reactor 开发了文件事件处理器,文件事件处理器:Redis6.0 引入多线程主要是为了提高网络 IO 读写性能,因为这个算是 Redis 中的一个性能瓶颈(Redis 的瓶颈主要受限于内存和网络)。redis是怎么知道哪个数据过期了的,redis保存了一个map,key是redis中的某个键,value是过期时间。数据过期了怎么淘汰:惰性删除 :只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友

2021-07-30 14:51:14 113

原创 AQS详解

Atomic 是指一个操作是不可中断的。原子性指的是即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的

2021-07-30 14:48:49 154

原创 关于多线程的认识

多线程进程与线程进程定义进程是获得资源后的正在执行的程序的统称流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FSccki1D-1627550799964)(https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.kanzhun.com%2Fimages%2Fseo%2Fmianshiti%2F20191125%2Fd67314c2cc0644bee5b25197e593fd73.jpg&ref

2021-07-30 14:46:40 232

原创 undo log实现事务的原子性以及MVCC解析

undo log实现事务的原子性以及MVCC解析事务并发带来的问题事务并发往往会带来一些不可预知的问题,一般可以包括**「脏读」、「幻读」、「不可重复读」和「丢失更新」**。脏读脏读是指事务A未提交的数据被事务B读取,事务A回滚,事务B读到的数据是脏数据。幻读幻读是指事务A查询一次数据后,事务B增加或减少了几条数据,事务A再次查询发现和之前查到的数据条数不一致,就好像出现了幻觉一样。不可重复读不可重复读是事务A两次查询期间事务B修改了数据,导致事务A两次读取的数据不一致。丢失更新丢失更新

2021-07-30 14:43:29 165

原创 关于Mysql的认识

本文主要是关于mysql的一些个人理解,如果文中用词或者理解方面出现问题,欢迎指出。此文旨在分享我对于mysql的整一些个人理解,对于细节方面不会去深究,若有名词或者理解方面的问题,欢迎指出Mysql须知:在此是默认读者熟悉了sql的一些概念,在此只是记录平时经常用到的一些sql以及背后的原理mysql的执行顺序select[distinct]fromjoin(如left join)onwheregroup byhavingunionorder bylimitMysql的执行顺序

2021-07-30 14:42:26 654

原创 SQL试题总结

SQL 练习题及答案1.查询没学过“谌燕”老师课的同学,显示(学号、姓名)(7分) SELECT hs.STUDENT_NO,hs.STUDENT_NAMEFROM test_student hsWHERE NOT EXISTS( SELECT 'A' FROM test_course hc LEFT JOIN test_teacher ht ON hc.teacher_no = ht.teacher_no LEFT JOIN test_stude

2021-07-30 14:40:06 493

原创 JavaIO详解

IO/NIO/BIO简介无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理设备。re

2021-07-29 17:11:09 2567 1

原创 关于git的笔记

gitgit怎么提交本地项目到github上下载git提交模式选择这是将本地仓库推送到远程仓库时要选择的验证方式通常的账户,密码ssh密匙对HTTP方式先登录github找到http登录的地址,这就是要推送的地址。PS:没有在github上创建仓库的先创建一个仓库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9BYsdcR5-1627549674064)(C:\Users\Administrator\Pictures\git\githttp.png)]

2021-07-29 17:09:05 63

原创 TCP解析

TCP协议首部格式图释:各个段位说明:源端口和目的端口:  各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现,源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序序号:  占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号确认号:  占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号,用作对另一方发送的tcp报文段的响应。其值

2021-07-29 17:04:56 1663

原创 ConcurrentHashMap

ConcurrentHashMapJDK8中ConcurrentHashMap参考了JDK8 HashMap的实现,采用了数组+链表+红黑树的实现方式来设计,内部大量采用CAS操作JDK8中彻底放弃了Segment转而采用的是Node,其设计思想也不再是JDK1.7中的分段锁思想。Node:保存key,value及key的hash值的数据结构。其中value和next都用volatile修饰,保证并发的可见性。<strong>class Node<K,V> implement

2021-07-29 17:02:42 73

原创 HashMap

HashMapHashMap 简介HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。 JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长

2021-07-29 17:01:09 146

原创 Arraylist

数据结构ArrayListArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。ArrayList继承于 AbstractList ,实现了 RandomAccesspublic class ArrayList<E> extends AbstractList<E> implem

2021-07-29 16:58:05 277

原创 Seata

seata如下图所示,Seata 中有三大模块,分别是 TM、RM 和 TC。 其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署。在 Seata 中,分布式事务的执行流程:TM 开启分布式事务(TM 向 TC 注册全局事务记录);按业务场景,编排数据库、服务等事务内资源(RM 向 TC 汇报资源准备状态 );TM 结束分布式事务,事务一阶段结束(TM 通知 TC 提交/回滚分布式事务);TC 汇总事务信息,决定分布式事务是提交还

2021-07-29 16:52:28 3247

原创 Mysql事务支持原理

Mysql事务支持原理Buffer Pool简介我们都知道MySQL中的数据都是存储在磁盘上的,那么如果每次都去磁盘上读取数据的话,那么效率肯定很低,所以在内存中就存在一个缓冲池,Buffer Pool,磁盘中的数据会被缓存到Buffer Pool中,就不需要再去磁盘中重新读取数据了既然Buffer Pool是存在于内存中的话,那么大小肯定就有限制了,默认情况下是128M,当然相对于内存大的机器,可以适当的增加Buffer Pool的大小,对于InnoDB储存引擎而言,Buffer Pool配置可以通

2021-07-29 16:22:21 235

原创 CompletableFuture

CompletableFuture为什么会有CompletableFuture在CompletableFuture未开发出来前,使用Java进行获取异步编程的结果是很不方便的,通常使用Future这个类获取结果,但是是Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不

2021-07-29 15:15:27 261

原创 ThreadLocal

ThreadLocal源码解析1. ThreadLocal是什么下面摘自ThreadLocal源码的注解This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialize

2021-07-29 13:47:38 113

原创 Spring组件原理

NacosGatewaynginxredissionRedisson是一个在Redis的基础上实现的Java驻内存数据网格redission在hash结构中的存储是一个hash结构类似这样key 285475da-9152-4c83-822a-67ee2f116a79:52 1在Redisson中,使用key来作为是否上锁的标志,当通过getLock(String key)方法获得相应的锁之后,这个key即作为一个key存储到redis hash结构的key中,并且将线程ID放在val

2021-07-20 20:26:02 435

原创 JVM中TLAB初认识

TLAB解读单线程分配内存单线程环境下JVM对于内存的分配是没有冲突的,目前有两种分配方式指针碰撞(bump-the-pointer)空闲列表首先,在class文件被加载进JVM时,就可以在分配内存前计算出内存分配的大小。如果采用指针碰撞的方式分配内存(下面我叫它撞针分配),由于可分配内存并不是连续的,会导致1.如果指针所在的那块内存剩下可分配内存满足要分配内存的大小,则可以在这块内存分配2.如果满足不了所有分配的内存大小,会导致指针频繁的找另一块内存去分配,造成Cpu执行效

2021-07-11 23:09:04 409

原创 JVM方法区构成

方法区保存着被加载过的每一个类的信息;这些信息由类加载器在加载类的时候,从类的源文件中加载出来;方法区是线程共享的;当有多个线程都用到一个类的时候,而这个类还未被加载,因为 <clinit> () 方法是带锁的,所以在多线程环境下进行类初始化的话可能会引起多个进程阻塞,并且这种阻塞很难被发现,让其他线程等待;方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。jvm也可以允许用户和程序指定方法区的初始大小,最小和最大限制;方法区同样存在垃圾收集,因为通过用户定义的类加

2021-07-11 19:59:34 263

原创 JVM类加载过程

类加载过程加载-》连接-》初始化-》卸载其中连接又可分为 检查-》准备-》解析类的加载过程通过全类名获取定义此类的二进制字节流将字节流所代表的静态存储结构转换为方法区的运行时数据结构/加载类信息在内存中生成一个代表该类的 Class 对象,作为方法区这些类信息的访问入口一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。数组类型不

2021-07-11 19:43:07 69

原创 JIT分析

JIT(Just In Time)1.什么是Just In Time编译器?在主流商用JVM(HotSpot、J9)中,Java程序一开始是通过解释器(Interpreter)进行解释执行的。当JVM发现某个方法或代码块运行特别频繁时,就会把这些代码认定为“热点代码(Hot Spot Code)”,然后JVM会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为:即时编译器(Just In Time Compiler,JIT)JIT编译器是“动态编译器”的一种,相对的

2021-07-11 19:34:23 328

原创 class对象创建流程

class对象创建流程类加载阶段通过全类名获取定义此类的二进制字节流将字节流所代表的静态存储结构转换为方法区的运行时数据结构/加载类信息在内存中生成一个代表该类的 Class 对象,作为方法区这些类信息的访问入口先通过全类名找到.class文件-》将.class文件存储的静态信息结构转成JVM动态的存储结构-》通过存储在方法区中的类信息创建一个在堆中的class对象,外界可以通过访问class对象访问到类信息方法区中的类信息会保存一个对class对象的引用,可以用来判断是否

2021-07-11 17:37:40 352

原创 详解.class文件

详解.class文件话不多说,直接上图.class文件理解:在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题并且保留了解释型语言可移植的特点,而通过即时编译器(jit)又有编译型语言执行效率高的特点。所以 Java 程序运行时比较高效。Java通过字节码文件和虚拟机jvm之间的关系,做到了平台无关性,一次编译,各平台都可运行。

2021-07-10 23:31:05 16183 1

原创 为什么说Java是编译与解释共存的语言

为什么说Java是编译与解释共存的语言在解释这个问题之前首先要知道什么是编译型语言和解释型语言计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种:1.编译2.解释由此高级语言也分为编译型语言和解释型语言。编译型语言:编译型语言注重编译,它是指将文件通过编译器一次性编译成特定平台(操作系统)可以运行的机器码。解释型语言:使用专门的解释器对源程序逐行解

2021-07-10 20:48:47 2689

原创 JVM详解

前言本文主要是关于jvm的一些个人理解,如果文中用词或者理解方面出现问题,欢迎指出。此文旨在分享jvm的整体知识,对于细节方面不会去深究,若有细节方面的问题,欢迎指出标题JVM类的加载过程类加载过程加载-》连接-》初始化其中连接又可分为 检查-》准备-》解析对象加载过程类加载检查-》分配内存-》初始化零值-》设置对象头-》执行init方法...

2021-07-10 13:28:09 380

原创 分布式事务

本地事务在分布式下的问题远程服务假失败:远程服务其实成功了,由于网络故障等原因没有返回,将导致订单(主线程)服务回滚,而调用的远程服务(库存)却扣减远程服务执行完成,下面的其他方法出现问题,将导致上面已执行的远程请求不能回滚,因为本地事务不能锁定远程服务的事务本地事务数据库事务的几个特性:原子性(Atomicity)、一致性(Consisstency)、隔离性(isolation)和持久性(Durabilily),简称就是ACID原子性:一系列的操作整体不可拆分,要么同时成功,要么同时失败

2021-06-15 22:28:32 104

原创 关于订单服务

订单服务电商系统涉及到3流,分别是信息流、资金流、物流,而订单系统作为中枢将三者有机的集合起来。订单模块是电商系统的枢纽,在订单这个环节上需要获取多个模块的数据和信息,同时对这些信息进行加工处理后流向下个环节,这一系列就构成了订单的信息流通。幂等性feign远程调用丢失请求属性问题-在调用feign方法时会调用feign底层的实现 @Override public Object invoke(Object proxy, Method method, Object[] args)

2021-06-15 22:27:36 361

原创 关于消息队列

消息队列RabbitMq介绍类型点对点式:消息只有唯一的发送者和接受者,但并不代表只能有一个接受者,可以很多接受者监听队列,只是只有一个可以接受到消息发布订阅式:可以由多个接受者监听这个队列,并且他们都可以收到消息JMS(Java Message Servie)定义:JavaApi 不跨语言 不跨平台基于jvm消息代理的规范,是一种协议ActiveMQ HornetMQ是JMS的实现AMQP(Advanced Message Queuing Protocol)网络线级协议

2021-06-15 22:26:00 62

原创 SpringSession原理

Session原理浏览器第一次访问服务器,登录成功后服务器会保存一个session对象(可看成map对象),session对象里以键值对的方式保存了用户的登录信息,并且每一个session对象都会对应一个独特的sessionId登录成功后服务器会返回一个JsessionId=xxx的Cookie给浏览器,浏览器下次访问时带上这个cookie,服务器就可以根据sessionid判断用户有没有登录。session共享问题服务器发回来的cookie默认作用域domain是本服务器域名,例如让认证服

2021-06-15 22:24:54 666

原创 额外的知识了解

验证码与接口防刷前端需要实现倒计时功能,防刷var num = 60; function timeoutChangeStyle() { $("#sendCode").attr("class","disabled") if(num == 0){ num = 60; $("#sendCode").attr("class",""); $("#sendCode").text("发送验证码"); }else{ var str = num + "s 后再次发送"; $("#sendCode").text(str)

2021-06-15 22:23:54 92

原创 异步编排与多线程

异步初始化线程的4种方式继承thread实现Runnable接口实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)jdk1.5后添加的 可以将Callable转化为Future Future内部继承Runable接口线程池定义一个配置类,改配置类向容器中注入一个threadPoolExecutor`@Configurationpublic class MyThreadConfig {@Beanpublic ThreadPoolExe

2021-06-15 22:22:23 313

原创 关于分布式锁

分布式锁所有服务可以去一个公共的地方**“占坑“**,可以去数据库,也可以去redis,当占坑成功后,其他服务会判断有没有坑位,若已经被占了,则等待坑位,等待可以采取自旋的方式。redis命令: set k v NXredisTemplate相关的api setIfAbsent()设置过期时间加锁成功 获取数据释放锁 [分布式下必须是Lua脚本删锁,不然会因为业务处理时间、网络延迟等等引起数据还没返回锁过期或者返回的过程中过期 然后把别人的锁删了]**redisson

2021-06-15 22:19:18 76

原创 关于高并发下的缓存

高并发下缓存问题缓存穿透:指查询一个不存在的数据,由于缓存不命中,将去查询数据库,但是数据库也没记录,并且没有将这次查询的null写入缓存,这将导致整个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义布隆过滤器//ToDo可以利用每个请求更换不同id继续缓存穿透,也将导致数据库瞬时压力增大风险:利用不存在的数据进行攻击,多并发下数据库瞬时压力增大,最终导致数据库崩溃解决方案:null结果缓存,并加入短暂过期时间缓存雪崩:指在我们设置key时采用了相同的过期时间,导致

2021-06-15 22:17:35 521

空空如也

空空如也

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

TA关注的人

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