- 博客(36)
- 收藏
- 关注
原创 【MYSQL】主从复制机制(图解)
主从复制是一种通过binlog(二进制日志)进行操作的一直复制机制,它会有一个主数据库,还会有一个从数据库,根据binlog就可以把主数据库中的信息复制到从数据库之中。这个主从复制的好处就是如果在并发压力大的时候,可以在主数据库进行增删改操作,在从数据库进行查操作可以降低主数据库的压力。如果主数据库崩溃了,此时可以把从数据库顶上。在主数据库备份期间,一般保证数据的一致性会加一把全局锁,此时为了保证数据库正常操作可以将从数据库进行访问操作。
2024-11-14 23:44:34 206
原创 【MYSQL】触发器
在DML操作后可能会在前或后触发到提前定义好的SQL集合,使用OLD和NEW引用触发器中变化的内容。对于MYSQL只支持行级触发器。
2024-11-14 18:18:44 167
原创 【MYSQL】InoDB引擎以及MVCC多版本并发控制【详解】
一个表空间对应的一个ibd文件,里面有许多段,其中包括数据段和索引段还有回滚段,在数据存储模型中的B+树中,叶子节点就是数据段进行存储的,非叶子节点就是索引段进行存储的,回滚段里存储了 undo log日志。然后里面还分为区->页->行。
2024-11-14 06:36:31 889
原创 【MYSQL】锁详解(全局锁、表级锁、行级锁)【快速理解】
锁是处理并发情况下,对数据的一致性的关键因素,也是并发情况下对效率影响非常大的。1、全局锁:锁定表中所有数据。2、表级锁:锁定整张数据库表。3、行级锁:对某行数据进行锁定。
2024-11-14 04:38:50 844
原创 MYSQL 精通索引【快速理解】
索引是一种可以快速查询的有序的数据结构。如果查询没用上索引的话,那么就会出现把表中的每一条数据进行扫描,这样效率太差。索引的优点就是查找速度快,并且减少进行IO请求次数,根据索引排序减少与CPU消耗。但是存储索引要空间进行存储,并且增删改的时候效率较低因为要在数据结构上修改节点。
2024-11-13 02:12:01 655
原创 MYSQL 存储引擎
在对于数据的完整性和一致性比较强,并且在并发条件下对数据的一直性强,那么就可以用Innodb引擎,对于一些不重要的数据,或者一致性较弱,但是频繁插入的数据可以用MyISAM引擎。这是MYSQL默认的存储引擎,它具有以下特点,第一点就是DML操作遵循ACID原则,并且支持。特点 1.不支持事务,不支持外键 2.支持表锁,不支持行锁。存储在内存上,只能用作临时表和缓存使用,访问速度快,支持hash索引。每一个表对应的一个ibd文件,存储该表的结构,数据,索引。,且有四种隔离级别。,提高并发访问性能。
2024-11-13 00:29:34 350
原创 Spring加载流程,Springboot自动装配原理
接下来就是通过BeanPostProccser下的beforeXXX进行初始化前的一些方法然后进行initBeanFactory下的afterpropertiSet放法实现初始化功能,可以自定义一些方法,初始化完成之后进行BeanPostProccser的afterXX方法,此时AOP就在这里进行的,因为AOP增强的肯定是可以用的bean里的各种方法,不然AOP在之前出现,就没有意义了因为bean都没被创建,代理对象都无法生成。之后使用然后进行销毁disableFactory的destroy方法销毁。
2024-11-11 01:36:16 319
原创 ReentrantLock【复习】
判断有没有人在阻塞队列就是先判断头结点和尾节点是不是相等,如果是相等证明是null,说明阻塞队列中没有元素,如果判断头节点的下一个节点是是自己当前线程,如果是证明是一个可重入锁,那么会返回false,否则返回true,或者判断头节点的下一个节点是不是null,如果是null此时证明有可能是多线程情况下,加入队列的两个节点,第一个节点可能还没有将头节点的next想连,此时第二个节点也加入队列,判断head.next是不是null,如果是null证明此时阻塞队列有元素,考虑到并发勤快了。
2024-11-10 14:57:04 543
原创 线程池ThreadPoolExcutor【复习必看】
因为如果使用Excutors这个类下提供好的线程,它里面有一些线程池是会有问题的,比如它们的某些队列是无界的,如果将线程加入道阻塞队列里不断地添加,会造成OOM。并且使用自定义线程池可以让这个线程池在这个程序达到最强的性能。如果有的业务是IO密集型的,核心线程数就是CPU核数*2,CPU密集型就是CPU核数+1,类似这种可以优化线程池达到最强性能。并且可以设置线程工厂的,在这可以定义每个线程造出来的时候设置线程的名字编号,为了之后出错调试信息的时候可以更加方便。
2024-11-09 02:58:48 454
原创 Cookie、Session、Token究竟区别在哪?图解
如图所示,左边是用户端(浏览器),右边是服务端(服务器)。如果想实现一个登录操作,那么我们可以在浏览器像服务器发送一个HTTP请求,通过对比账号和密码,服务器对比后正确的话,会在服务器设置cookie的值,他是一个key-value的一种结构,通过set-cookie发送给浏览器,浏览器接收到set-cookie的话,会直接将cookie里的值设置成浏览器的cookie里。
2024-11-07 07:57:08 244
原创 Java中四种引用类型【快速理解】图文
我们正常手动new出来的对象都是强应用,不对他进行别的操作的时候它是不会进行垃圾回收的。除非将它的,此时调用垃圾回收器才会将它回收。
2024-11-07 04:16:13 991
原创 【线程与并发】详谈 可见性,有序问题
如果我们要进行一个数据处理,我们先需要在硬盘中存储的数据读取到我们的内存中,此时cpu要将数据读取出来进行计算,是直接从内存中读取放到自己的register中,然后进行计算,这个速度在计算机看来还是不够快,这个时候就出现了缓存,现在计算机有三级缓存。根据下表可以看出来3、2、1级缓存读取时间依次减少。现在我们的CPU一个里面有多颗CPU,如果是双核CPU那么一颗CPU里有两个核,L1、L2都存在核内,L3存在核外CPU内。
2024-11-06 20:29:58 654
原创 【乐观锁与悲观锁】synchronized锁精讲(图文理解)
它们直接最大的区别就是权限不一致。用户态权限较低,不能进行特权操作以及对硬件资源进行操作。反观内核态权限最高,可以进行特权操作,可以对硬件资源操作,比如对内存进行管理以及进程调度。在Java中用户态可以操作jvm,而内核态是进行系统的操作的。在JDK早期,synchronized是重量级锁,执行重量级锁定时候,就需要jvm像系统进行操作,也就是从用户态转向内核态,并且申请到锁后,还要从内核态转回用户态,这样比较消耗资源,效率低下。
2024-11-06 07:37:18 1312
原创 【乐观锁悲观锁】什么是CAS?
通过学习后发现实际上它底层为了保证CAS过程中,比如将取到的值,和准备交换前获取的数据对比,如果一致将计算好的值存放进去。大概流程是如果要对某一位置进行数据修改操作,那么先读取最新的值,然后进行将准备存入的新数据处理或计算好,在存入前再获取一下存入值的位置的数据,与最初读取的数据是否一致,如果一致就可以把计算或处理好的值存入,如果不一致,从新从最开始的流程来一遍,直到该位置两次读取的两个值一致确认没有线程对该位置的值操作,那么可以将处理和计算后的值存进去。实际上CAS操作就是它的全名一致,比较和交换。
2024-11-06 00:35:19 125
原创 FutureTask、completableFuture简单介绍
其次就是new Thread(这里面都是Thread实现类,或者实现runnable接口的)如果放callable接口是无法存放的,所以借用一个futuretask,它即是runnable的实现类又是callable的实现类,所以他可以放到这个Thread里创建任务。它是一个执行异步计算的一个接口,不过他的get接口是阻塞接口,如果进行异步计算的过程中,调用了get接口,那么开始阻塞,直到计算完成把结果返回,get出来才会结束。
2024-11-05 03:26:05 219
原创 Java线程间通讯机制
下面实例就是一种用synchronized锁加wait()和notifyAll()实现的一种多线程直接的通讯方式,通过一个标志位和wait和notifyAll进行对信息的判断和处理。还可以用Lock.lock() Lock.unLock() await() signal()时间等待通知机制实现通讯。
2024-11-05 01:00:42 166
原创 Java线程通信的虚假唤醒问题(图文快速理解)
举个例子就相当于,如果最开始创建了这个资源类的对象,然后我开启了两个线程,一个线程循环执行+1的方法,一个线程不断循环执行-1的方法。=1)符合条件,那么执行+1,并且唤醒所有wait中的方法,那么+1方法的线程被唤醒可以抢夺锁,直到+1方法的线程获取到锁之后,+1方法才会继续从wait之后开始执行。结果就是两个线程不断轮询的输出 +1 -1 +1 -1。,相当于一个加一方法,一个减一方法,并且里面都上了锁,是线程安全的,如果在判断里发现条件不符合,那么就会进行wait等待(
2024-11-04 20:52:02 280
原创 什么是JUC并发编程(快速理解版)
进程:运行一个程序就开启了一个进程,是系统调度和资源分配的基本单位。线程:是系统进行运算调度的最小单位,它包含在进程之中,是进程实际运算单位。一个进程中可以开启多个线程。
2024-11-04 17:47:33 239
原创 数据结构二叉树(完全二叉树、满二叉树,二叉排序树,AVL树平衡二叉树,红黑树) (图文快速理解版)预习复习必看
最多只有两个子节点如果没有根节点的就是空节点树,有一个根节点的就是单节点树。如果只有左节点的叫做左斜树,只有右节点的是右斜树。
2024-11-04 08:30:00 1110
原创 CopyOnWriteArrayList线程安全list集合(图文快速理解版)新手必看
CopyOnWriteArrayList就是一个多线程下读少写多的线程安全的一个List集合,他的功能实际上就和名字一样,在写的时候复制一份。
2024-11-03 19:20:58 113
原创 ConcurrentHashMap线程安全的map集合(图文快速理解)【学习面试必看】
也就是说ConcurrentHashMap底层是一个segment段数组,我们存储的数据放在segment段数组下的HashEntry数组。每次锁数据实际上都是锁一个segment,也就是说有几个segment数组就会支持同时几个线程操作。这样比直接用一个synchronized并发性强,颗粒化高。
2024-11-03 18:20:09 519
原创 Java集合基本数据结构(快速理解版)
目录Collection接口ListArrayListLinkedListVectorSetHashSetLinkedHashSetTreeSetMap接口HashMapLinkedHashMapTreeMapHashtable
2024-11-02 02:22:36 1325
原创 BIO NIO AIO 大白话版
管道先注册到selector中,然后将所有客户端注册到selector中,这里的selector采用的轮询可以将新的客户端也注册进来,并且他轮询到对应的客户端的时候会处理数据,并且打开管道,将管道和客户端连接,此时客户端就可以拿到客户端的数据。通过不同的轮询就可以处理不同客户端的数据了,不过实现依旧是一对一操作的。是一种同步阻塞的方式,它指的是客户端与服务端进行直接相连接,服务端使用过程中计算中,那么客户端就会阻塞等待。是一种异步非阻塞方式,所处理数据的返回值是通过回调函数来监听拿到的。
2024-11-01 00:22:57 128
原创 String StringBuffer StringBuilder(快速区分)
如果通过字面量复制他存储在常量池中,如果再进行字面量赋值操作的时候它会先查找常量池中是否有,如果有直接引用,没有的话会创建一个新的数据在常量池中,如果是new对象创建字符串会创建在堆空间中。如果修改也是创建新的字符串。可变数据类型,底层属于可变Char数组实现,他是线程线程不安全的,因为他是可变并且没有加锁,不过他是效率最高的,因为他不加锁,他有可变的扩容机制,不需要每次修改数据创建一个新的数据。可变数据类型,底层属于可变Char数组实现,他是线程安全的,因为他使用了synchronized的修饰。
2024-10-31 13:23:49 189
原创 拦截器和过滤器的区别(快速理解版)
两者都可以执行一些介入、阻止请求,但是他们的执行顺序不同。请求来了,过滤器先执行,因为他更接近于底层,它处理的是servlet前后请求的处理,它是实现filter接口实现的,一般用于跨域请求,或者日志监控,过滤顺序由编写顺序决定。拦截器它是在controller前后执行的,它更偏向于业务,是通过handlerInterceptor接口实现的,一般用于拦截请求,权限认证等,执行顺序由bean的加载顺序执行,可以通过@Order调整优先级。根据这个图我们就很好理解。
2024-10-31 12:26:58 117
原创 ThreadLocal(快速理解版)
如果在使用ThreadLocal的时候,使用了线程池,那么如果核心线程数如果大于0,那么线程一直存活,就可能不会销毁,此时ThreadLocal创建后不会自动销毁(因为是强引用),此时ThreadLocal不手动关闭就会造成内存泄漏问题。使用了ThreadLocal会造成如果在当前线程开辟一个新的线程执行任务的时候,新的线程无法获取原线程中ThreadLocal中的数据。由于是当时父线程创建子线程的时候复制的数据,那么子线程如果没被销毁的话,此时子线程一直使用的是父线程最初的数据,会造成。
2024-10-31 11:56:23 158
原创 Redis的基本数据类型(快速理解)
运用2:如果手动实现一种可重入锁的时候,可以使用该类型,Key对应的锁的名字,map中的key对应的线程的名字(防止锁的误删),map中的value对应该线程拿了几次锁,释放的时候也要释放对应的次数。运用1:例如在登录验证码登录时候,可以先像手机端发送时效为1分钟的验证码,然后在redis中设置TTL为1分钟的验证码,如果登录时,用户输入的验证码和redis存活的验证码一直则登录成功。运用2:例如在分布式锁中,就可以用string类型,通过是否能获取到对应的redis数据来判断是否加锁成功。
2024-10-31 11:00:43 238
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人