自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mysql(8) - MVCC多版本并发控制

快照读的实现基于MVCC,所以快照读读到的数据可能并不是数据的最新版本,有可能是之前提交过的历史版本。MVCC即多版本并发控制,即MVCC是通过数据行的多个版本管理来实现数据库的并发控制,这项技术使得查询一些正在被另一个事物更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。creator_trx_id:表示创建这个read View的事务id,只有在对表中记录做改动时(执行插入,更新,删除)才会为事务分配事务id,否则在一个只读事务中的事务id都默认为0。

2022-12-02 23:05:24 291 1

原创 Mysql(7) - 锁

(MDL锁),表锁的一种。当有事务对数据表中的某一行或几行数据加了锁时,同时会给当前表设置一个标识,标识当前表中已经有行锁了,当有事务想对表加锁时,就不需要一行一行遍历去找有没有行锁会和自己不兼容,只要看意向锁就可以决定自己是否该加表锁。:和悲观锁相反,它觉得自己取数据的时候别人肯定不会修改这个数据,不会对这个数据先上锁,但是在取数据时会判断一个在此期间别的线程有没有对这个数据进行过更新,也就是不采用数据库本身的锁机制,而是通过程序来实现,在程序上我们可以采用版本号机制或者CAS机制实现。

2022-12-02 21:10:00 299

原创 Mysql(6) - 事务

比如转账的情景,A一开始有100块,B也有100块,A转100给B,A变为了0元,B变为200,他们的金额之和不变,A的数据也合理,这是一致。当事务在执行过程中遇到各种错误或者服务器宕机等情况,我们需要把数据恢复成原来的样子,也就是保证事务的原子性,这个过程称之为回滚,但其实回滚不是物理层面上的回到过去,而是逻辑层面的,让事务看起来像什么都没做一样。不可重复读:事务A读取了一个字段的值,事务B对这个值进行了修改,当事务A再去读这个字段的值时,发现和上一次读的值不一样,就称为不可重复读(A仍然在本次事务内)

2022-12-01 14:41:47 89

原创 Mysql(5) - 索引优化与查询优化

它会在根据索引找到所有符合条件的数据后,根据后面的like条件(只能是lastname,因为我们的索引没有包含address)进行一次筛选,留下满足后两个条件的数据,再用这些数据回表。可以看到,我们加入了索引,也就是优化了拿t1的数据去匹配t2的操作,在SNLJ中我们需要一条一条的匹配,但是加入了索引之后,这个查询操作的时间复杂度就大大降低了,O(n * logm)。比如你创建了一个index(a,b,c),而你要查询的字段是a,b,那么此时通过该索引找到的数据就是你所需要的数据,查询完毕后要撤销临时表。

2022-11-29 17:07:42 564

原创 Mysql(4) - 性能分析

首先我们通过Explain或者show profiling查看sql语句的具体执行情况,如果是sql的执行慢,那么就可能是索引没有创建好或者表的设计不够完美;如果是sql的等待时间长,那么我们需要对服务器参数进行调整,也许是缩短sql的有效响应时间。当上述操作就做完后,sql层面的优化就基本完成,这时候可以从服务器角度进行优化,创建mysql集群,进行读写分离。首先先观察服务器是否有周期性的波动,比如在双十一期间,有大量相同的sql请求,我们可以通过增加缓存或者修改缓存失效策略来改进缓存,加快响应速度。

2022-11-29 00:26:59 211

原创 Mysql(3) - 浅谈索引

在5.7时我们要想不让优化器使用创建的索引,就只能把索引删掉,当我们又要用的时候又要手动创建索引,不仅麻烦,而且浪费系统资源。在阿里巴巴的Java开发手册中明确指出,在堆Varchar字段创建索引时,必须指定索引长度,没必要对全字段建立索引,根据实际。的字段创建索引,因为页空间有限,在页数比较庞大时,能够缩小一点因为类型导致的空间都是不小的优化。4.避免对经常更新的表创建过多的索引,因为更新很可能导致索引也要更新,消耗系统资源。10,在多个字段都要创建索引的情况下,联合索引优于单列索引。

2022-11-28 16:55:37 590

原创 Mysql(2) - 浅谈索引

虽然现在有了数据页的概念,但是我们查询一条数据仍然是不方便的。其实不然,实际上,B+树的创建是现有根再有叶,起初有一个数据页,我们称之为根页面,里面存了一些数据,当数据慢慢多了起来,需要创建新页,根页面把数据复制给新页,然后自己作为目录页指向新页,根页面的位置是不会变的。这里举一个场景,当我们使用的是二级索引(以c2创建),我们要查找c1 = 10 c2 = 20的数据,在目录页中此时有两个c2 = 20,那么我们应该去哪个目录页就不确定了,解决这个问题只需要在目录页中加上主键,因为主键是唯一的。

2022-11-11 15:18:34 217

原创 mysql(1) - InnoDB 和 MyISAM存储引擎的比较

1.MyISAM不支持事务,这就导致了业务的安全性无法得到保障,当出现宕机等特殊情况时,无法进行安全恢复。4.InnoDB相对于MyISAM会占用更多的内存空间,因为它会存储缓存索引和表数据。2.当业务需求中不仅仅是增加和查询时,还有删除和更新,我们应该选择InnoDB。1.InnoDB是支持事务的,可以确保事务的完整的提交和回滚。2.MyISAM的访问速度快,性能要优于InnoDB。5.InnoDB支持行锁,提高了高并发场景下的性能。4.支持表锁,在高并发场景下性能不好。:主要的非事务处理的存储引擎。

2022-11-09 21:33:12 371

原创 Redis-master节点的散列插槽

Redis会把每一个master节点映射到0-16383一共16384个插槽(hash slot)上,(假如是三个master节点,那么这16384个插槽就平均分给这三个master)数据key与这些插槽绑定起来,如何进行映射就是用到刚才说到的key的有效部分,根据CRC16算法得到这个key的hash值,用这个hash值对16384取余,得到slot值,就对应某个某个插槽。这里我们需要先了解一个概念:key的有效部分。假设一个key是{abc}def,那么这个key的有效部分就是abc。

2022-11-06 20:45:20 246

原创 Redis-master节点宕机后的处理方式

在redis集群中,每个节点各司其职,有的当老大,有的当小弟,老大负责写,小弟负责读。但是如果老大挂了,这些小弟就群龙无首了,我们的服务就会崩盘,谁都不愿意这种事情发生,所以我们需要了解当master节点挂了之后redis的处置方式。如果第三项都一样,那么其实选哪个slave都一样,因为他们的数据都是最新的,都可以成为主节点,那么这时候就根据他们的id判断,id越小优先级越高。我们应该从slave节点中选举出一个新的master节点,并且让原来的slave节点的老大都变成这个新的老大。这里我们有一套标准。

2022-11-05 18:03:55 1884

原创 Redis-主从

集群的主从关系搭建好了,那么最重要的一环,数据同步是怎么实现的呢?我们必须保证在从节点中读到的数据和主节点的一致,那就需要数据同步。回想上一章所说的数据持久化方式,我们很容易能够想到RDB和AOF两种保存数据的方式,在这里主从数据的同步应用的是RDB的方式。

2022-11-04 15:43:05 156

原创 Redis - 数据持久化的两种方式(RDB和AOF)

RDB可以看成在特定时刻对内存数据进行的一次快照,触发快照需要达到的条件可以自己指定,比如save 5 1,意思就是在5秒内发生了至少一次更新操作,就会触发rdb,每次rdb会生成一个新的rdb文件,redis在启动服务时会加载这个rdb文件从硬盘中恢复数据。我们知道磁盘的IO速度是比较慢的,所以每一次rdb其实需要消耗不小的系统资源,需要等待的时间也比较长,那么如果在某次rdb过程中服务器发生了宕机,而你设置的rdb频率为1min一次,那么你就会丢失上次rdb之后的1min的数据,即数据安全性的问题。

2022-11-03 18:44:15 96

原创 简单梳理Spring

不是,Spring并未对bean进行线程安全的处理,因为bean多数情况下是无状态的(没有数据存储功能),所以也不存在线程安全问题,但是如果是类似ModelAndView这样的有状态对象,那么就需要自己去保证线程的安全,此时可以把类的作用域改为prototype。ApplicationContext在容器启动时就把所有bean都加载好了,避免了上述问题,而且在我们需要bean的时候能够直接拿到,但是这样的方式也使得它占用内存空间较多,造成不必要的浪费。:一个事务能读取另一个事务未提交的数据。

2022-09-15 20:41:54 139

原创 简单梳理SpringMVC

在这之前,xml备受青睐,因为他以低耦合的方式几乎完成了框架中的所有配置,但是随着项目越来越大,xml中的配置会越来越复杂,导致不方便维护,所以注解配置方式就产生了。该方法的返回值为boolean类型,当返回true时,那就会继续执行下一个拦截器的preHandler(),若是最后一个拦截器,那么就让Controller处理请求,如果返回false,那么后面的拦截器和Controller都不会执行。控制的是对象,反转的是对象的创建权和管理权。所以重定向是用户能够感知到的,且访问地址也发生了变化。

2022-09-02 21:05:14 138

原创 简单梳理Http

1.1中默认使用长连接,在http1.0中,默认使用短连接,也就是每次请求都要重新建立一次连接,而建立连接和断开连接需要经过三次挥手四次握手的过程,所以会有比较大的开销。:负责建立和管理节点间的链路。:进一步管理网络中的数据通信,控制数据链路层与传输层之间的信息转发,建立,维持和终止网络的连接,将数据点对点从源端经过若干中间节点传送到目的端,从而向传输层提供最基本的数据传输服务。:无连接,并且是不可靠传输,不使用流量控制和拥塞控制,支持一对一,一对多,多对多的交互通信,面向报文,适用于实时应用的场景。

2022-09-01 19:55:25 163

原创 Java基础之反射

我们使用了一个PropertyDescriptor类,通过传入属性名称和对应类的class对象得到一个PropertyDescriptor实例,它里面封装了属性的get和set方法,getReadMethod()获取get方法,getWriteMethod()获取set方法,之后再进行方法调用,这就是内省的整个使用过程。众所周知,反射是java框架的灵魂,java反射对于任意一个类都可以获取到它的属性,方法,构造器,并且进行调用,这种动态获取类信息以及动态调用对象属性方法的功能称为反射。...

2022-08-29 16:34:08 98

原创 Java基础之多线程

我们需要知道JMM中包含了本地内存和主内存,共享变量储存在主内存中,每个线程都拥有一个私有的本地内存,本地内存中保存了该线程需要使用到的主内存的副本拷贝,线程对变量的操作都在本地内存中进行,不能直接读写主内存的数据,这就造成一个问题,A线程操作完共享变量后没有马上同步到主内存中去,那么B线程使用的就是修改之前的值。2.实现Runnable接口:重写run()方法,在main()中创建该类实例,作为thread类的构造参数,得到的thread对象才是真正的线程对象,用该对象调用start()方法启动线程。..

2022-08-27 22:22:37 241

原创 BIO,NIO,AIO的概念

AIO:异步非阻塞,在NIO中,线程是在IO操作准备好时得到通知,之后由线程自行进行IO操作,但AIO中是在IO操作已经完成后,再给线程通知,因此线程不会因为IO操作阻塞。Channel:通道,通过它读取和写入数据,通道和流很相似,但是通道是双向的,即可以读数据也可以写数据,但流是单向的。NIO: 同步非阻塞,采用了基于Reactor模式的工作方式,IO调用不会被阻塞,相反是注册“感兴趣”的特定IO事件,在发生特定事件时,系统再通知我们,而不是一直等待IO操作。在NIO中,所有数据都是通过缓冲区来处理的。.

2022-08-27 14:38:26 84

原创 Java基础中常见的一些问题(持续更新中)

创造String实例有两种方式:new String()或String s = “xxx”。StringBuffer是线程安全的,StringBuilder是线程不安全的,但sb效率高,在单线程情况下推荐使用。字节流是按8位以字节为单位传输,字符流是按16位以字符为单位传输。String是不可变的,例如String s1 = “abc”;接口不能有方法实现,也就是说接口的方法都是抽象方法,但抽象类可以有方法实现。按功能来分:输入流和输出流。按类型来分:字节流和字符流。接口不能有构造器,抽象类可以有构造器。.

2022-08-26 22:59:04 836

原创 JVM相关问题(补充中...)

反向委托:当类加载器加载第三方jar时,比如spi接口(外设接口),这个接口属于核心api,首先通过双亲委派机制将类加载请求委托到引导类加载器,引导类加载器去加载spi核心类,spi接口中使用有第三方的jar包jdbc.jar,第三方的jar需要使用线程上下文类加载器(应用类加载器)去加载,这个步骤就叫反向委托。系统类加载器是程序中默认的类加载器,java应用的类都是由他加载。启动类加载器加载java核心类库,用于提供jvm自身需要的类。扩展类加载器加载JDK安装目录下的扩展目录里的类。......

2022-08-25 23:45:09 148

原创 Java基础之集合框架的一些问题

Hash函数计算出的索引值是一个固定长度的输出值。在解决hash冲突时,我们一般采用链地址法,链地址法相对于开放地址法需要更多的内存空间,但它可以减少在查找和插入具有相同hash值的key的操作过程中的平均查找长度,因为在链地址法中,待比较的key都是hash值相同的key,但开放地址法中还包含了hash值不同的key。被static修饰的静态变量也是不可序列化的,因为序列化是保存的是对象状态,静态变量保存的是类状态,所以static修饰的静态变量天然不可序列化,不管有没有被transient关键字修饰。.

2022-08-25 23:42:03 213 1

空空如也

空空如也

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

TA关注的人

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