LOADING

加载过慢请开启缓存 浏览器默认开启

2024用友后端一面(一)

自我介绍

项目介绍,如何使用redis的

用来缓存一些热点数据,如文件的一些默认上传路径,用户的一些基本信息等,减少数据库的压力,提高系统的性能。

mysql的事务特性

MySQL的事务具有以下四个特性,也被称为ACID特性:

  1. 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改要么全部执行,要么全不执行。原子性确保事务的完整性。
  2. 一致性(Consistency):在事务开始和完成时,数据库的一致性约束必须保持不变。一致性保证数据库的数据满足预定的规则。
  3. 隔离性(Isolation):并发的事务被隔离,使得它们彼此独立,互不干扰。隔离性确保事务的独立执行。
  4. 持久性(Durability):一旦事务提交,则其结果永久保存在数据库中。即使系统崩溃,重新启动后数据库还能恢复到提交事务后的状态,保证了事务的持久性。

事务一致性如何保证

事务的四大特性就可以保证事务的一致性。

讲一下有哪些锁

MySQL中有多种锁类型,主要包括:

乐观锁:乐观锁在事务提交时检查数据是否被其他事务修改过,如果被修改过则拒绝提交。常用于读多写少的场景。
悲观锁:悲观锁假设并发操作时会发生冲突,因此在操作期间持有锁来避免冲突。常用于写多读少的场景。
全局锁:对整个数据库实例加锁,限制除了超级用户外的所有查询和修改操作。一般用于备份、恢复等操作。
表级锁:对整个表加锁,其他连接无法修改或读取该表的数据,但可以对其他表进行操作。
行级锁:对一行记录加锁,只影响一条记录。通常用在DML语句中,如INSERT, UPDATE, DELETE等。
共享锁:共享锁表示对数据进行读操作,多个事务可以同时为一个对象加共享锁。
排他锁:排他锁表示对数据进行写操作,一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。

这些锁根据不同的应用场景和需求进行选择。在MySQL中,锁的粒度可以从行级到全局级进行变化,以满足不同的并发控制要求。

MVCC

MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于实现数据库的事务隔离。MVCC可以在一定程度上解决读-写冲突和写-写冲突,提高数据库的并发性能。

如何创建readview

在MVCC中,事务执行过程中看到的数据是否是一致的

MVCC的实现,是通过保存数据在某个时间点的快照来实现的。即为:不管需要执行多长时间,每个事务看到的数据都是一致的。

什么时候快照读,什么时候当前读

不加锁的select语句是快照读,加锁的select语句是当前读。

缓存雪崩,缓存击穿,解决方案

缓存穿透:

访问一个缓存和数据库中不存在的key,此时请求会直接访问到数据库,并且查不到数据,没法写缓存,所以下次请求同样会访问到数据库上,此时缓存起不到作用,请求每次都会走到数据库,流量大时数据库可能会被打挂掉,这就是缓存穿透。
解决方法:参数校验,布隆过滤器,缓存空对象

缓存雪崩:

大量热点数据key设置了相同的过期时间,导致缓存在同一时刻全部失效,造成了数据库请求量激增,压垮数据库。还有一种情况是redis挂了,此时所有请求都会走到数据库上,造成数据库压力过大。
解决方法:第一种情况下可以给不同的key设置不同的过期时间,第二种情况下可以使用redis集群,保证redis的高可用性。

缓存击穿:

缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方法:设置热点数据永不过期,或者加互斥锁,只让一个线程去访问数据库,其他线程等待。

快排基本思想,分析时间复杂度

快速排序的基本思想是:通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
时间复杂度:O(nlogn) 二分所以是logn,每次都要遍历一遍数组,所以是n

设计模型了解吗?讲一下开闭原则了解吗?

开闭原则:对扩展开放,对修改关闭。即在不修改原有代码的基础上,通过扩展的方式来实现新的功能。

类加载过程

类加载是指虚拟机把描述类的数据加载到内存中,并对数据进行校验,解析初始化,最终变成被虚拟机直接使用的class对象的过程。类的生命周期包括:加载,验证,准备,解析,初始化,使用,卸载。其中加载过程如下:

  1. 加载:通过类的全限定名获取定义此类的二进制字节流。
  2. 将该二进制流的静态存储结构转化为方法区的运行时数据结构。
  3. 在堆中生成一个代表该类的java.lang.Class对象,作为方法区中这些数据的访问入口。

JVM内存模型划分

堆区:这是最大的一块内存,由所有线程共享。存放对象实例以及数组。垃圾回收的主要区域。
方法区:存放已被加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
栈区:每个线程创建时都会创建一个虚拟机栈,每个方法执行时都会创建一个栈帧用于存储局部变量、操作数栈、动态链接、方法出口等信息。
程序计数器:记录正在执行的指令,并且指向下一条要执行的指令。
本地方法栈:与虚拟机栈所不同的是虚拟机栈是执行Java方法服务,而本地方法栈主要执行的是本地方法服务。

垃圾回收算法

标记-清除算法:标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
复制算法:将内存分为两块,每次只使用其中一块,当这一块内存用完后,将还存活的对象复制到另一块上,然后清除已使用的内存。
标记-整理算法:标记出所有需要回收的对象,然后将存活的对象向一端移动,然后清除端边界以外的内存。
分代收集算法:根据对象的存活周期将内存分为多个区域,一般将内存分为新生代和老年代,新生代中的对象存活周期较短,老年代中的对象存活周期较长。根据不同的区域采用不同的垃圾回收算法。

spring如何解决循环依赖

spring使用三级缓存解决循环依赖,三级缓存分别是singletonFactories,earlySingletonObjects,singletonObjects。

反问部门业余,发展发现,对我后续提升的建议

本文作者:GWB
当前时间:2023-11-09 11:11:09
版权声明:本文由gwb原创,本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 国际许可协议。
转载请注明出处!