滴滴面经

201 阅读4分钟
1、处理高并发的方法

(1)系统拆分
(2)缓存
(3)消息队列
(4)分库分表
(5)读写分离

2、Java和C++有什么关系和区别?
  • 都是面向对象的语言,都支持封装、继承及多态
  • C++支持指针,Java没有指针的概念
  • C++支持多继承,而Java不支持多重继承,但是允许一个类实现多个接口
  • Java自动进行无用内存回收操作,不再需要程序员进行手动删除
  • Java不支持操作符重载
3、SpringBoot常见注解

启动类上的注解是@SpringBootApplication,是SpringBoot的核心注解,主要组合包含了以下三个注解:
@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能 @ComponentScan:Spring组件扫描

4、SpringMVC的原理(SpringMVC的流程)

(1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。
(2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的handler。
(3)解析到对应的Handler后,开始由HandlerAdapter适配器处理。
(4)HandlerAdapter会根据Handler调用真正的处理器处理请求,并处理相应的业务逻辑。
(5)处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。
(6)ViewResolver会根据逻辑View查找实际的View。
(7)DispaterServlet会把返回的Model传给View。
(8)把View返回给请求者。

5、数据库事务

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变为另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都执行。
例子:转账

6、事务具有的四个特性
  • 原子性。事务是数据库的逻辑工作单位,事务中包含的各个操作要么都做,要么都不做
  • 一致性。事务执行的结果必须是使得数据库从一个一致性状态变为另一个一致性状态。
  • 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作和使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
  • 持续性:一个事务一旦提交,它对数据库中的数据的改变是永久性的。
7、MySQL的四种隔离级别
  • Read Uncommitted(读取未提交内容)
    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,被称为脏读。
  • Read Committed(读取提交内容)
    大多数数据库系统的默认隔离级别。一个事务只能看见已经提交事务所做的改变。会导致不可重复读,因为同一个事务的其他实例在该实例处理期间可能会有新的提交,所以同一select可能返回不同的结果。
  • Repeatable Read(可重复读)
    MySQL的默认隔离级别,确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。会导致幻读。
  • Serializable(可串行化)
    强制事务排序,使之不可能相互冲突,解决幻读问题。在每个读的数据行上加上共享锁。
8、事务的实现原理

事务是基于重做日志文件(redo log)和回滚日志(undo log)实现的。
每提交一个事务必须先将该事务的所有日志写入到重做日志进行持久化,数据库就可以通过重做日志来保证事务的原子性和持久性。
每当有修改事务时,还会产生undo log,如果需要回滚,则根据undo log 的反向语句进行逻辑操作,比如insert一条记录就delete一条记录。undo log主要实现数据库的一致性。

9、MVCC

多版本并发控制。MVCC的实现,是通过保存数据在某个时间点的快照来实现的。根据事务开始的时间不同,每个事务对同一张表,同一个时刻看到的数据可能是不一样的。

10、进程间通信方式
  • 管道:有两个限制,一是半双工的通信,数据只能单向流动,二是只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  • 信号:信号可以在任何时候发给某一进程,而无需知道该进程的状态;
  • 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。
  • 消息队列
  • 共享内存
  • Socket:可用于不同机器间的进程通信