![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面经
文章平均质量分 84
五敷有你
稳中求进,多平安
展开
-
Redis缓存的使用
当出现Redis查不到数据,数据库也查不到数据的情况,我们就把这个key保存到Redis中,设置value="null",并设置其过期时间极短,后面再出现查询这个key的请求的时候,直接返回null,就不需要再查询数据库了。两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第 二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们 还可以根据具体的业务需求进行自定义的缓存淘汰,原创 2024-06-12 23:05:29 · 3271 阅读 · 4 评论 -
IO多路复用
epoll是为了解决select的缺点,它定义了epoll_event结构体来解决,解决了select存在最大连接数的限制,epoll不会遍历所有的文件描述符(fd),epoll会将准备就绪的文件描述符维护在一块指定的空间内,每次从中取出已经准备就绪的文件描述符处理,大大提高性能。在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不断轮询成百上千的socket连接,当某个或者某些socket网络连接有IO就绪的状态,就返回对应的可以执行的读写操作。原创 2024-06-03 17:12:26 · 646 阅读 · 36 评论 -
Spring解决循环依赖
BeanB同样回去一级缓存中查找是否存在B实例,由于还没有创建,Spring会将bean B的半成品放入二级缓存,继续创建买这个B需要依赖A,由于A的工厂对象已经放在三级缓存中了,spring可以直接获取三级对象中的beanA的工厂对象,通过它来创建beanA的实例。Spring容器开始创建A对象,会先去一级缓存中查看是否有BeanA的实例,如果没有就会创建一个A的实例,并将其工厂对象放入三级缓存中,然后BeanA 的创建因为需要注入B而被挂起,Spring开始创建BeanB对象。,并将其放入一级缓存。原创 2024-06-01 11:14:11 · 857 阅读 · 6 评论 -
Synchronized的升级过程
Thread-1加锁失败,进入锁膨胀阶段,为Object对象申请Monitor锁,通过object对象头获取到持有锁的线程,将该线程设置为owner,将对象头的markword设置为指向monitor的地址。线程获取轻量级锁,会使用CAS操作,将MarkWord替换成指向自己的锁记录的指针,如果CAS成功,则说明获取轻量级锁成功,可以进入同步块,如果CAS失败,则表示锁竞争失败,需要升级为重量级锁。如果有取值为null的锁记录,表示重入,这时重置锁记录,表示重入计数-1。原创 2024-05-30 17:35:36 · 721 阅读 · 3 评论 -
零拷贝(Zero Copy)
零拷贝技术指的是在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文以及CPU的拷贝时间。他的作用是在数据报从网络设备到用户程序空间传递的过程,减少数据拷贝的次数,减少系统调用,实现CPU的零参与,彻底消除CPU在这方面的负载,实现零拷贝的最主要的技术就是DMA数据传输技术和内存区域映射技术。零拷贝就是可以减少数据在用户缓冲区和内核缓冲区之间的反复的I/O拷贝操作。零拷贝机制可以减少用户进程地址空间和内核地址空间之间因为上下文切换带来的CPU开销。原创 2024-05-28 15:43:46 · 1055 阅读 · 46 评论 -
redoLog&undoLog&binLog
undo log和redo log 记录的物理日志不一样,他是逻辑日志,可以认为当delete一条数据时,undo log会记录一条对应的insert记录,反之亦然,当update一条记录时,他记录一条与之相反的update记录,当执行rollback时,就可以从undo log中的逻辑记录读取到相对应的内容并进行回滚。而缓冲区的脏页并不是实时刷新的,而是一段时间后将缓冲区的数据刷新到磁盘中,加入刷新到磁盘的过程中出错了,而提示用户数据提交完成,数据却没有持久化下来,就会出大问题的。没有保证事务的持久性。原创 2024-05-12 09:48:25 · 820 阅读 · 36 评论 -
事务的基础
实际上分为两个部分,其中的原子性,一致性,持久性,实际上是由InnoDB的两份日志来保证的,一份是redo log日志,一份是undo log日志。事务是:一组操作的集合 ,他是不可分割的工作单位。那实际上,我们研究事务的原理就是研究MySQL的InnoDB引擎如何保证事务的这四大特性。原子性:事务是一个不可分割的最小单元,要么全部成功,要不全部失败。持久性:事务一旦提交或者回滚,他对数据库的数据改变就是永久的。隔离性:数据库保证事务不受外部并发操作影响的独立环境下运行。原创 2024-05-12 09:07:24 · 358 阅读 · 0 评论 -
MySQL的行级锁
并不是,因为是非唯一索引,这个 结构中可能有多个18的存在,所以,在加锁时会继续往后找,找到一个不满足条件的值(当前案例中也 就是29)。默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读。2.InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中所有数据记录加锁,此时就。排他锁(X):允许获取排他锁的事务执行更新语句,组织其他事务获取相同数据的共享锁与排他锁。原创 2024-05-11 10:43:58 · 749 阅读 · 4 评论 -
MySQL的表级锁
表共享读锁表独占写锁。原创 2024-05-11 08:00:00 · 538 阅读 · 33 评论 -
MySQL的全局锁
全局锁就是对整个数据库实例加锁,加锁后实例状态就处于只读状态,后续的DML的写语句,DDL语句,都将被阻塞。典型的常见就是做全库的逻辑备份,将所有的表进行锁定,从而获取一致性视图,保证数据的完整性。那备份的时候不加全局锁会怎样??假如现在有三张表,tb_stock .tb_order ,tb_orderlog进行备份的时候先备份stock库存表,然后有业务扣减库存(修改的库存),生成订单 (修改了订单表)之后备份order订单表,此时订单表是操作后的数据信息。原创 2024-05-10 10:00:00 · 605 阅读 · 1 评论 -
前缀索引与单列&联合索引的选择
选择性是指不重复的索引值(基数)和数据表记录的总数的比值,索引选择性越高效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引, 而非单列索引。此时不是立刻返回,因为匹配都是匹配的前缀,拿到后应该去用email的值去与条件的email比较,是:返回,通过上述执行计划,我们可以看出来在name字段是有两个索引的一个单列索引,一个联合索引。,这样可以大大节约索引的空间,从而提高索引的效率。原创 2024-05-10 08:00:00 · 839 阅读 · 0 评论 -
索引的SQL提示与覆盖索引
因为在联合索引的可以找到全部需要的数据(非叶子节点有name,phone age, 叶子节点有id),所以不需要回表。explain select * from tb_user force index(idx_name) where name ='吕布'尽量使用覆盖索引(查询是使用了索引,并且需要返回的列在该索引中已经全部能找到),减少使用select *。use index 代表 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据。force index(索引名)原创 2024-05-09 10:24:44 · 1073 阅读 · 2 评论 -
索引失效情况
因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不 如走全表扫描来的快,此时索引就会失效。这是个在MYSQL查询的时候,会对语句进行评估,如果走全表扫描的时间比走索引慢,则放弃锁引,走全表扫描。创建age的索引,注意idx_user_age的索引命名规范,我就随便写了,运行后如下:索引执行。在tb_user的phone列加上索引,然后进行条件查询,在这个情况下,是可以走索引的。首先age是没有索引的,仅仅依靠age,复合索引是不生效的。在不加上单引号的情况,如图,是进行的全文扫描。原创 2024-05-09 09:36:52 · 738 阅读 · 39 评论 -
最左前缀法则
但是查询时,跳过了phone这个列,所以后面的列索引是不会使用的,也就是索引部分生效,所以索 引的长度就是202。注意 : 最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段(即是 第一个字段)必须存在,与我们编写SQL时,条件编写的先后顺序无关。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃了某一列,索引将会部分失效。对于最左前缀法则,指的是查询时,最左边的列,也就是id,必须存在,否则索引全部失效,而且中间不能跳过某一列,否则该列后面的字段索引将全部失效。原创 2024-05-08 17:59:28 · 558 阅读 · 2 评论 -
SQL语句的性能分析
最终我们发现,在慢查询日志中,只会记录执行时间超多我们预设时间(2s)的SQL,执行较快的SQL 是不会记录的。慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:s,默认是10s)d的所有SQL语句的日志。# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志。那这样,通过慢查询日志,就可以定位出执行效率比较低的SQL,从而有针对性的进行优化。以上都是按照时间层次的判定,执行时间长就好,执行时间短就不好,但这是一种粗略的判定。原创 2024-05-08 16:29:58 · 745 阅读 · 1 评论 -
MySQL的索引
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。假如我们要执行的SQL语句为 : select * from user where age = 45;1). 无索引情况在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为 全表扫描,性能很 低。2). 有索引情况。原创 2024-05-08 11:29:35 · 1571 阅读 · 36 评论 -
四种网络IO模型
IO是计算机内存与外部设备之间拷贝数据的过程。CPU访问内存的速度远高于外部设备。因此CPU是先把外部设备的数据读取到内存,在进行处理。时间局部性空间局部性一次IO会把一块或一块旁边的数据全部加载到内存种。原创 2024-04-30 11:14:55 · 2349 阅读 · 55 评论 -
TCP的三次握手四次挥手
等待客户端的确认。服务器的连接释放(FIN)报文段的FIN=1,ACK=1,序列号seq=m,确认序列号ack=u+1。第四次握手:客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1作为确认序号ack。原创 2024-04-09 22:21:53 · 1757 阅读 · 44 评论 -
MVCC多版本并发控制
MVCC(Multi-Version Concurrency Control)即多版本并发控制。原创 2024-04-08 17:24:06 · 905 阅读 · 53 评论 -
【面经】interrupt()、interrupted()和isInterrupted()的区别与使用
如果打断线程正在sleep,wait,join会导致被打断的线程抛出InterruptedException,并清除打断标记。如果打断正在运行的线程,则会设置打断标记。park的线程被打断也会被设置打断标记。Thread类的静态方法。检测当前线程的中断标记,返回一个boolean并清除中断状态,其连续两次调用的返回结果不一样,因为第二次调用的时候,线程的中断状态已经被清除了,会返回一个false.如上:正常运行时被打断是不会被清除标记的。测试线程是否被打断,不会清除中断状态。场景:在sleep时打断。原创 2024-04-06 13:38:09 · 1035 阅读 · 62 评论