自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 07:MySQL innodb引擎详解

1.简单介绍主要的存储引擎(1)innodb通过使用MVCC获得高并发性,并且实现了sql的四种隔离级别,默认为可重复读。同时,使用了next-key-lock解决幻读问题,还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。(2)mylsamMyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。在MySQL 5.5.8版本之前MyISAM存储引擎是默认的存储引擎(3)memoryMemory存储引擎(之前称HEAP存储引擎)将表中的数据存放在

2021-05-21 17:01:22 208

原创 06:MySQL排序 和 短时提高性能方法

MySQL排序问题排序的时候,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。对于这个sql select city,name,age from t where city=‘杭州’ order by name limit 1000 ;city是索引字段,对于这种查询(1)初始化 sort_buffer,确定放入 name、city、age 这三个字段;(2)从索引 city 找到第一个满足 city='杭州’条件的主键 id,也就是图中的 ID_X;(3)到主键 id

2021-05-21 16:58:19 321

原创 05:MySQL的锁 全局锁、表锁、行锁

锁是为了处理并发问题,根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类全局锁:MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。这是做全局逻辑备份的,也就是把整库每个表都 select 出来存成文本。在锁住的时候,数据库是只读状态。如果是主库,这时候所有的更新插入全部停止,如果是从库,那么binlog同步也会延迟。如果备份数据库的时候,如果不在全局锁,因为不同表之间的执行顺序不同进而备份的时间不同。如果某个表在

2021-05-17 20:47:57 128

原创 MySQL增量数据同步 Canal

github官方地址:https://github.com/alibaba/canalcanal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。基于日志增量订阅和消费的业务包括数据库镜像数据库实时备份索

2021-05-15 16:45:36 366

原创 04:mysql索引总结

1.为什么需要索引:类似书本的目录,如果没有索引,需要从上到下一个一个遍历。2.常见的索引模型:hash 有序数组 b+树(1)hash是k v 的存储结构 用一个hash函数把key换算成一个确定的位置,然后吧value放入到数组中,key可能会重复,重复的拉成链表。hash的值不是递增的,所以对于增加只需要往后追加即可,对于区间查询的时候效率很低,hash表这种结构只适合等值查询的场景,nosql形式。(2)有序数组对于范围长训性能就非常优秀,他是依次递增的,所以查询的时候根据二分可以快速查询到数

2021-05-14 17:30:43 59

转载 线程池基本介绍

线程的创建方式,主要有三种继承Thread类,实现Runnable接口,实现CallableRunable没有返回值,而Callable是有返回值的,存在Future类中。Callable 相当于 Runnable加上一个返回值Future 是存储执行将来才会产生的结果FutureTask 相当于Future +RunnableCompletableFuture管理多个Future的结果,也可以对很多任务组合处理线程池目前有两种类型一种ThreadPoolExecutor,常规的线程池,一种

2021-05-14 15:50:06 59

原创 03 : mysql事务隔离问题

1.事务的特性:acid 原子性 一致性 隔离性 持久性2.事务的隔离级别:读未提交 读已提交 可重复读 串行化3.事务可能出现的问题:(1)读未提交可能出现脏读,在执行了一个修改的操作的时候,这时候还没有提交事务,就直接可以看到了修改的结果。隔离级别提高可以避免(2)读已提交可能出现不可重复读的问题,事务A先读取了一条数据,然后执行逻辑的时候,事务B对这条数据进行了修改,然后提交事务,这时候A再次读取这条数据,会发现两次数据是不一致的,隔离级别提高可以避免(3)可重复读会造成幻读,事务A根据id

2021-05-14 15:44:25 111 1

原创 02 :日志系统:一条SQL更新语句是如何执行的

redolog:是在存储引擎层,是innodb存储引擎独有的,他有固定的大小,循环写入的,空间足够的时候,数据库压力不大的时候,会慢慢刷到磁盘,当空间不够的时候,会将数据刷到磁盘然后覆盖写最新的数据,他就是mysql说的wal技术,关键点就是先写日志,然后再写磁盘,因为他是顺序写入磁盘,后续读取很快。有了redolog之后,及时数据库发生异常重启,之前提交的记录都不会丢失,这个是crash-safe关于顺序写为什么快后面连接,kafka也是顺序写入磁盘 参考 https://blog.csdn.net/.

2021-05-14 15:42:08 64

原创 01:一条SQL查询语句是如何执行的

1.连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接,连接的用户过多,会报oom2.查询缓存:mysql8之前,做一次查询的时候,会在内存中存取一个kv,记录当前查询的sql和结果,如果查询的时候有直接返回,但是一张表,有了更新之后,所有的查询都会失效,mysql8之后取消了查询缓存3.分析器:对一条sql语句做具体的分析,比如查询会有select 后面是查询的具体字段 from之后是表 where后面是条件,可能from之后表没有或者select字段不对都会直接返回错误4.优化器:对s.

2021-05-14 15:38:57 45

原创 redis常见问题

redis中文官网http://www.redis.cn/Redis为什么这么快1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,在sort set的时候,底层使用了跳表的数据结构,查找和操作的时间复杂度都是O(1);2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消

2021-03-07 20:42:02 61

原创 kafka 入门介绍

kafka是中间件 主要作用是为了削峰和解耦akf原则将中间件划分为xyz三个层次x轴为主备,保证数据安全y轴根据业务划分服务,可以分为日志服务,购物服务等,类似topic,每个服务处理自己服务内部的一些事物z轴是分片处理kafka中有 几个定义 topic broker partition group producer consumertopic 是逻辑上的定义,具体可以根据业务来划分,比如日志的topicbroker主要可以理解为一个个服务器,是实际的,一个日志的topic可以放在

2021-03-07 18:06:34 125

转载 java 对象的创建过程,对象的内存布局

1.检测类是否被加载:当虚拟机执行到new时,会先去常量池中查找这个类的符号引用。如果能找到符号引用,说明此类已经被加载到方法区(方法区存储虚拟机已经加载的类的信息),可以继续执行;如果找不到符号引用,就会使用类加载器执行类的加载过程,类加载完成后继续执行。2.为对象分配内存:类加载完成以后,虚拟机就开始为对象分配内存,此时所需内存的大小就已经确定了。只需要在堆上分配所需要的内存即可。具体的分配内存有两种情况:第一种情况是内存空间绝对规整,第二种情况是内存空间是不连续的。对于内存绝对规整的情况相.

2021-02-18 15:52:28 78

原创 java类的全加载过程

类的加载过程步骤类的加载过程主要分为3步1、加载(loading) 2、链接 linking(链接分为3小步 1、校验 ()2、准备 3、解析) 3、初始化加载双亲委派双亲委派一次从下至上依次调用,自定义加载器→AppClassLoader→ExtClassLoader→Bootstrap classLoader在调用到最高层没有的时候,再依次向下调用,如果还没有找到类,则会报ClassNotFoundException注意:双亲委派的上一层是父加载器,通过引用调用parent方法属性,而不是

2021-02-18 14:38:48 86

原创 java 是值传递的

Java中的传递,是值传递,而这个值,实际上是对象的引用。关键看这个值是什么,简单变量就是复制了具体值,引用变量就是复制了地址。字符串是不可变的,不会被修改

2021-01-10 17:52:54 44

原创 操作系统-进程管理

进程的状态进程的三种状态1 ) 运行态(该时刻进程实际占用 CPU) 。2) 就绪态(可运行,但因为其他进程正在运行而暂时停止)。3) 阻塞态(除非某种外部事件发生,否则进程不能运行).在操作系统发现进程不能继续运行下去时,发生转换 1 。转换2和3是由进程调度程序引起的 . 进程调度程序是操作系统的一部分,进程甚至感觉不到调度程序的存在。系统认为一个运行进程占用处理器的时间已经过长,决定让其他进程使用CPU时间时,会发生转换2。在系统已经让所有其他进程享有了它们应有的公平待遇而重新轮

2020-12-22 17:22:58 89

转载 synchronized源码

转载https://blog.csdn.net/zwjyyy1203/article/details/106217887

2020-12-15 15:20:01 59

转载 Java对象的内存分配过程是如何保证线程安全的

1Java对象的内存分配我们知道,Java是一门面向对象的语言,我们在Java中使用的对象都需要被创建出来,在Java中,创建一个对象的方法有很多种,如使用new、使用反射、使用Clone方法等,但是无论如何,对象在创建过程中,都需要进行内存分配。拿最常见的new关键字举例,当我们使用new创建对象后代码开始运行后,虚拟机执行到这条new指令的时候,会先检查要new的对象对应的类是否已被加载,如果没有被加载则先进行类加载。在类加载检查通过之后,就需要给对象进行内存分配了,分配的内存主要用来存放对象的

2020-12-14 09:59:20 113

原创 操作系统内核级线程

为了充分应用多核的CPU,应该使用内核级的线程。可以给每个CPU并行使用内核线程,在用户级线程的时候,操作系统无法感知,所以用户级线程同一时间只能使用一个核心。内核级线程维护着两套栈,一套用户栈,一套内核栈。int指令触发的时候,发生中断,硬件里有写入内核栈的指令,此时触发内核栈,进行切换。并且内核栈也会连上用户栈,形成一套栈。A调用B,B进行read,然后读取到中断,中断的时候,read内核调用,使用到硬件写入的内容,用户栈和内核站进行了关联,然后再内核中执行,执行的时候会磁盘读写,这时候就会阻.

2020-11-05 21:18:03 207

原创 操作系统用户级线程

进程是OS分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间)。线程:保留了并发的优点,也避免了进程的切换代价,避免每次查看映射表等操作。进程=资源+指令执行序列 这样就分治了指令切换就是线程所处理的事情 资源就是映射表的切换线程需要切换时,调用yield函数,释放手中的资源,实现切换create函数是制造第一次切换时候的样子,就是做出三样东西1.申请一部分内存做TCB2.申请一部分内存做栈,栈里.

2020-11-04 23:07:50 201

原创 操作系统多进程图像

多进程启动main中的fork创建了第一个进程,这是初始化的进程,然后init执行科shell,就是Windows的桌面。用户执行的任务,也是创建一个进程。在linux中的一个命令,如ls等都是创建一个进程,去执行这个任务。多进程如何组织操作系统管理进程的核心就是PCB(Process Control Block)用来记录进程信息的数据结构,用PCB的结构体形成数据结构,比如形成一个队列。根据进程的状态,区分开来,便于管理,不同状态的变化,由操作系统控制,根据状态的转化,推进进程前进。多进程.

2020-11-04 21:24:57 71

原创 操作系统调用的实现

一个用户程序直接加载到内存中,内核也是在内存中,为什么在调用内核的时候,不能直接就在内存中直接调用访问呢?如果可以的话,操作系统中很多重要的东西,都能直接被访问调用了,比如root的密码,那么机器一点都不安全了。系统调用就是通过调用进入内核的一种手段。同样内存中,为什么可以让应用程序访问不到操作系统,是因为处理器的硬件设计,在硬件上,把内存分割成用户态和内核态,内核态可以访问任何数据,用户态不能访问内核的数据。想要使用内核数据,只能通过操作系统提供的调用,进行用户态和内核态的切换。计算机对内存的使用

2020-11-03 21:57:31 216

原创 计算机启动操作系统内部做了什么

计算机的硬件中有写死的位置,通过 CS+IP,即是0XFFFF0,刚开机的时候,直接找到这个位置,这个位置有代码,取指,执行如果这里过不去,那么即是硬件是坏的,如果正常,通过BIOS,读取一个扇区,512KB的代码,这里的就是操作系统的开始。放入内存中,将0磁道,0扇区的读取到0X7C00,这时这里即是进入引导扇区这就是引导扇区的代码,使用汇编写的,因为汇编每一条的指令,最后都可以直接生成机器语言,不用编译,引导需要完整的控制,不会出现问题。读取硬件信息,进行设置总的.

2020-11-02 23:02:04 285

原创 NIO基本模型

BIO的时候,会阻塞,解决方法是有新的请求,那么就再起一个新的线程。对应新的接受数据读写。NIO是就一个线程,在accept的时候,调用内核了,如果此时没有客户端连接进来,BIO的时候就是没有返回值,一直卡着,但是在NIO中,不会卡着,返回-1。如果来了客户端的连接,accept返回的是这个客户端的fd,可能是5文件描述符这种。在服务端中,socket分为listen socket (连接请求三次握手之后,往我这里扔,我去通过accept,得到连接的socket),还有一个连接的socket(连接之后

2020-10-19 22:45:28 141

原创 socket编程和网络io模型BIO

socket其实就是一个四元组,包含clientIp clientPort serverIp serverPort 他也是内核级别的,几遍你不调用accept,也会就建立的过程

2020-10-18 15:04:02 116

原创 解决Windows本地端口占用问题

1.netstat -ano|findstr 8080后面这个47968为端口pid,下面输入47968杀死即可2.taskkill /f /t /im 47968

2020-10-09 09:55:52 191

转载 Thread.Sleep(0) 的妙用

Thread.Sleep(0) 表示挂起 0 毫秒,你可能觉得没作用,你要写 Thread.Sleep(1000) 就有感觉了。似乎毫无意义。MSDN 的说明:指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。Thread.Sleep(0) 并非是真的要线程挂起 0 毫秒,意义在于这次调用 Thread.Sleep(0) 的当前线程确实的被冻结了一下,让其他线程有机会优先执行。Thread.Sleep(0) 是你的线程暂时放弃 cpu,也就是释放一些未用的时间片给其他线程或进程使用,就相当于一

2020-09-28 11:20:35 673

原创 操作系统中的pagecache,jvm中文件的堆内存分配,堆外和mmap直接分配

Page cache由内存中的物理page组成,其内容对应磁盘上的block。page cache的大小是动态变化的,可以扩大,也可以在内存不足时缩小。cache缓存的存储设备被称为后备存储(backing store),一个page通常包含多个block,这些block不一定是连续的。pagecache可以大大加快文件的读写速度,一次读取或者写入4k的数据,节省了连接的各种开销。但是pagecache一般是写在内存中的,一旦断电或者是故障,数据会丢失。没办法保障数据一定是安全的,如果为了保障安全,不实

2020-09-24 18:37:21 1481 1

原创 计算机硬件的与操作系统的基础知识

汇编语言的执行过程汇编本质上就是机器语言的助记符,为了方便人理解,可以直接转化为二进制01计算机通电的时候,CPU读取内存中的程序(由电信号输入),时钟发生器不断震荡通断电,通断电一次就是一个周期,推动着CPU内部一步一步的执行,CPU没动作 的时候,时钟发生器可能会空转。当CPU计算完成的时候,直接用电信号写完,写给显卡输出。CPU的基本组成PC -> Program Counter 程序计数器 (记录当前指令地址)Registers -> 暂时存储CPU计算需要用到的数据ALU

2020-09-21 20:52:00 516

原创 mybatis中大于,小于,大于等于,小于等于,转义写法

& &amp; < &lt; > &gt; " &quot; //双引号 ' &apos; //单引号a<=b a <=b 或者 a <![CDATA[<= ]]>ba>=b a >=b 或者 a <![CDATA[>= ]]>ba!=b.

2020-09-18 13:35:30 1164

原创 网络协议

应用层将会话、应用合并。这层主要处于用户态,开辟一个端口,然后确定可以连接到这个服务器。传输控制层即平时遇到的TCP,这层主要有三次握手和四次分手。TCP是可靠的网络协议。三次握手—数据传输—四次分手这是一个最小的粒度,不可分割的。三次握手客户端向服务端发送消息,服务端接受到消息回复,客户端再次向服务端发送一条确认消息。平时一般服务端回复确认即可建立连接,为何需要三次。客户端第一次发送消息的时候,服务端收到,并且回复。这时候站在服务端的角度,其实只是收到一次客户端发过来的信息,回复了确认,却.

2020-09-16 23:40:37 127

原创 Spring中的ASM

Spring中的ASM使用主要就是使用visitor模式,直接先读取原来的文件,相当于reader,然后通过adapter,自己定制一套自己的写法,最后再写入到一个新的文件中,即相当于改变了原有代码,增加了切面,这就是动态代理,cglib和jdk的动态代理,最底层使用的都是ASM1.ASM是什么?ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class

2020-09-12 15:47:00 4405

转载 MySQL索引里的具体内容——InnoDB中一棵B+树能存多少行数据

一、InnoDB 一棵 B+ 树可以存放多少行数据?InnoDB 一棵 B+ 树可以存放多少行数据?这个问题的简单回答是:约 2 千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从 InnoDB 索引数据结构、数据组织方式说起。我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是 4k,而对于我们

2020-09-02 14:34:53 277

原创 计算机中的缓冲(Buffer)、缓存(Cache)、复用(Pool)、分治(Sharding)、亲密(粘性sticky)、权衡(balance)

缓冲(Buffer)从应用程序访问内核,动用io的时候,可以一个一个字节的调用,也可以积攒一部分的数据,一次性的调用内核。此时buffer的作用,主要是上下游处理速度不匹配。消息队列也可以算做是buffer,批处理也行。比如你有数据要写到磁盘,这时候数据到磁盘落地,一次写一个字节数据,和一次写100个数据。效率差的很大。缓存(Cache)主要就是pagecache,也缓存,平时经常使用的时候,就会直接拿出来,用的比较少,就会被淘汰。为了加快磁盘的读写,主要就是为了提速。复用(Pool)各种池化的东

2020-08-27 16:51:13 786

转载 I/O模型BIO,NIO,AIO及其演化与Netty原理精讲,Netty线程模型

一 Java I/O模型1 BIO(Blocking IO)BIO是同步阻塞模型,一个客户端连接对应一个处理线程。在BIO中,accept和read方法都是阻塞操作,如果没有连接请求,accept方法阻塞;如果无数据可读取,read方法阻塞。2 NIO(Non Blocking IO)NIO是同步非阻塞模型,服务端的一个线程可以处理多个请求,客户端发送的连接请求注册在多路复用器Selector上,服务端线程通过轮询多路复用器查看是否有IO请求,有则进行处理。NIO的三大核心组件:Buff

2020-08-10 11:26:11 1892

原创 完整的springcloud微服务中的组件简单介绍

首先用户可能点击一个按钮,打到一个springboot的接口上面,但是不知道这具体是哪个服务,这时候要获取服务的列表,服务的列表可能会很多,如果准确快速的找到这个服务,这时候Eureke就出来了,是服务的注册中心,所有的服务都要在这里注册,Eureka通知管理。当从Eureka上面找到服务的时候,这时候就需要调用这个服务,那就是Feign。调用不同的服务,但是在调用的时候,万一这个服务挂了怎么办,此时就需要客户端的负载均衡,那就是Ribbon。一个服务挂了可以去切换到其他的服务。这就是最简单的spring.

2020-08-08 18:42:51 2406

转载 Java 种15种锁的介绍:轻量级,自旋锁,重量级锁,互斥锁,公平锁,可重入锁,独享锁,互斥锁等等…

Java 中15种锁的介绍在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁 / 非公平锁可重入锁 / 不可重入锁独享锁 / 共享锁互斥锁 / 读写锁乐观锁 / 悲观锁分段锁偏向锁 / 轻量级锁 / 重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁 / 非公平锁公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁非公平

2020-08-06 09:49:40 2037

原创 设计模式——门面模式和调停者模式

当内部关系特别复杂的时候,需要一个大管家,来调停所有的服务,就是我们实际中使用的消息中间件,消息直接扔到中间件上面去,需要的话,直接上去拿即可,所以这就是解耦

2020-08-03 22:40:52 1825

原创 设计模式——工厂系列(简单工厂 静态工厂 工厂方法 抽象工厂)

任何可以产生对象的方法或类,都可以称之为工厂单例也是一种工厂为什么有了new之后,还要有工厂灵活控制生产过程权限、修饰、日志等等任意的定义交通工具继承Moveable任意定制生产过程Moveable XXXFactory.create();任意定制产品一族package com.design.factorymethod;public class Main { public static void main(String[] args) { /*Car c =

2020-07-30 22:52:56 1489

原创 knife4j——兼容swagger,接口管理工具

首先pom里面添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <depende

2020-07-29 14:29:11 1751

转载 cpu密集型和io密集型应用,线程池使用时大小的设计

1、cpu密集型,多是运算型应用,io操作较少,主要消耗cpu资源,此时若开启多个线程,容易造成频繁的cpu上线文切换,增加额外时间消耗,顾线程数=cpu核心数+/-1比较合适。2、io密集型,读写比较频繁,考虑阻塞、非阻塞、同步、异步等Io操作,CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度),增加线程数量可以充分利用cpu空闲时间片段,提高程序想用速率。网上对其线程池核心线程数大小有两种说法,第一种,线程数=cpu核数/(1-阻塞系数),阻塞系数大小范围

2020-07-29 13:22:28 2589

空空如也

空空如也

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

TA关注的人

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