面试汇总
MySQL
mysql隔离级别、如何避免脏读和幻读
https://blog.csdn.net/johnstrive/article/details/46724315
- Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
- Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
- Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
- Serializable(可串行化) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如: **脏读(Drity Read):**某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。 **不可重复读(Non-repeatable read):**在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。 **幻读(Phantom Read):**在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
Read Committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
mysql主从同步原理和过程
slave(从服务器)
master(主服务器)
mysql主从是异步复制过程
master开启bin-log功能,日志文件用于记录数据库的读写增删 需要开启3个线程,master IO线程,slave开启 IO线程 SQL线程, Slave 通过IO线程连接master,并且请求某个bin-log,position之后的内容。 MASTER服务器收到slave IO线程发来的日志请求信息,io线程去将bin-log内容,position返回给slave IO线程。 slave服务器收到bin-log日志内容,将bin-log日志内容写入relay-log中继日志,创建一个master.info的文件,该文件记录了master ip 用户名 密码 master bin-log名称,bin-log position。 slave端开启SQL线程,实时监控relay-log日志内容是否有更新,解析文件中的SQL语句,在slave数据库中去执行。
mysql中有哪几类锁
按照对数据操作的锁粒度来分:行级锁、表级锁、页级锁、间隙锁
行级锁分为共享锁和排他锁
表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)
按照锁的共享策略来分:共享锁、排他锁、意向共享锁、意向排他锁
从加锁策略上分:乐观锁和悲观锁
其他:自增锁
有哪些锁类型?
事务隔离级别?
幻读解决方案?
MVCC(Multi-Version Concurrency Control)
表中的每条数据都会添加两个字段:
- 创建版本号:创建记录时系统版本号
- 删除版本号:删除记录时系统版本号
有没有碰到过死锁,怎么处理的?
有没有碰到过明明应该用到索引,explain显示却没有用到索引的情况?怎么解决的?
遇到过哪些需要并发控制的场景?怎么解决的?
有没有了解分布式事务?用的什么方案?具体实现细节?
一、两阶段提交(2PC)
两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。
运行过程
1准备阶段
协调者询问参与者事务是否执行成功,参与者发回事务执行结果。
2提交阶段
如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。
需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。
存在的问题
1 同步阻塞 所有事务参与者在等待其它参与者响应的时候都处于同步阻塞状态,无法进行其它操作。
2 单点问题 协调者在 2PC 中起到非常大的作用,发生故障将会造成很大影响。特别是在阶段二发生故障,所有参与者会一直等待状态,无法完成其它操作。
3 数据不一致 在阶段二,如果协调者只发送了部分 Commit 消息,此时网络发生异常,那么只有部分参与者接收到 Commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。
4 太过保守 任意一个节点失败就会导致整个事务失败,没有完善的容错机制。
二、补偿事务(TCC)
TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。它分为三个阶段:
- Try 阶段主要是对业务系统做检测及资源预留
- Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。
- Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。
举个例子,假入 Bob 要向 Smith 转账,思路大概是: 我们有一个本地方法,里面依次调用
1首先在 Try 阶段,要先调用远程接口把 Smith 和 Bob 的钱给冻结起来。
2在 Confirm 阶段,执行远程调用的转账的操作,转账成功进行解冻。
3如果第2步执行成功,那么转账成功,如果第二步执行失败,则调用远程冻结接口对应的解冻方法 (Cancel)。
优点: 跟2PC比起来,实现以及流程相对简单了一些,但数据的一致性比2PC也要差一些
缺点: 缺点还是比较明显的,在2,3步中都有可能失败。TCC属于应用层的一种补偿方式,所以需要程序员在实现的时候多写很多补偿的代码,在一些场景中,一些业务流程可能用TCC不太好定义及处理。
三、本地消息表(异步确保)
本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
1在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
1之后将本地消息表中的消息转发到 Kafka 等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
3在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。
优点: 一种非常经典的实现,避免了分布式事务,实现了最终一致性。
缺点: 消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。
四、MQ 事务消息
有一些第三方的MQ是支持事务消息的,比如RocketMQ,他们支持事务消息的方式也是类似于采用的二阶段提交,但是市面上一些主流的MQ都是不支持事务消息的,比如 RabbitMQ 和 Kafka 都不支持。
以阿里的 RocketMQ 中间件为例,其思路大致为:
第一阶段Prepared消息,会拿到消息的地址。 第二阶段执行本地事务,第三阶段通过第一阶段拿到的地址去访问消息,并修改状态。
也就是说在业务方法内要想消息队列提交两次请求,一次发送消息和一次确认消息。如果确认消息发送失败了RocketMQ会定期扫描消息集群中的事务消息,这时候发现了Prepared消息,它会向消息发送者确认,所以生产方需要实现一个check接口,RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败。
优点: 实现了最终一致性,不需要依赖本地数据库事务。
缺点: 实现难度大,主流MQ不支持,RocketMQ事务消息部分代码也未开源。
分库分表怎么做?
mysql优化?
分库分表?怎么解决分表后的分页,排序问题?
超买超卖怎么产生的?怎么解决?
主从复制原理?
有没有碰到过主从延迟?解决方法?
索引优化?
mysql互相同步数据不一致,怎么处理?
pt-checksum、pt-sync
1.选择(Selection) 2.映射(Projection) 3.联合(Union) 4.交集(Intersection) 5.差集(Difference) 6.笛卡尔积(Cartesian Product) 7.连接(Join)
btree索引和hash索引的区别
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
(1)Hash 索引仅仅能满足"=",“IN"和”<=>“查询,不能使用范围查询。
(2)Hash 索引无法被用来避免数据的排序操作。
(3)Hash 索引不能利用部分索引键查询。
(4)Hash 索引在任何时候都不能避免表扫描。
(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
总结:
HASH索引适合等式比较的操作,不能用来加速order by操作,也不能确定在两个值之间大约有多少行,会影响一些查询的执行效率。而且只能使用整个关键字来搜索一行。 BTREE索引,使用大于,小于,BETWEEN,不等于,LIKE等操作符的时候都可以用。对索引字段进行范围查询的时候,只有BTREE索引可以通过索引访问。HASH索引实际上是全表扫描的。
PHP
php-fpm进程数
国外技术大拿给出这么个公式: 在 N + 20% 和 M / m 之间。 N 是 CPU 内核数量。 M 是 PHP 能利用的内存数量。 m 是每个 PHP 进程平均使用的内存数量。 适用于 dynamic 方式。 static方式:M / (m * 1.2)
laravel实现原理
nginx fpm php 之间的关系和怎么通信的
php7新特性
spl
PHP内部结构,PHP生命周期,垃圾回收
PHP这些框架是怎么实现文件自动加载的
怎么上传大文件
php安全有哪些?
php优化方法?
php底层变量数据结构?数组实现方式?
php垃圾回收机制?
php7新特性,php7性能?
你会在生产环境使用php7吗?为什么?
php spl接口
php错误机制?你们是怎么处理异常的?
laravel依赖注入实现原理?有什么好处?
laravel优缺点?
你怎么选择框架?
php的自动加载原理?laravel是怎么实现的?
nginx php-fpm php
###Nginx
- nginx怎么做负载均衡?怎么做反向代理?
Linux
linux一些常用命令 lsof tail awk sed wc grep find
select、poll、epoll区别?
怎么把移动硬盘300G文件快速拷贝到linux? nc -l
如何查看端口占用 lsof -i:8080
Redis
- 如果用redis的list做消息队列,可能会出现哪些问题?怎么解决?
- redis哪些数据类型?
- redis使用场景?
- redis怎么做集群?
- redis持久化原理?
- memcache和redis区别?怎么选择?
- memcache内存模型?使用场景?一致性hash算法?
rabbitMQ
- rabbitmq中exchange种类和区别 https://zhuanlan.zhihu.com/p/29463325 https://www.cnblogs.com/luxiaoxun/p/3918054.html https://blog.csdn.net/rainday0310/article/details/22082503
- rabbit有哪些应用场景?你们使用的场景?
- 多个生产者同时消费应该消息会不会有问题?
- rabbitmq基本使用?(交换机类型及使用场景)
- RabbitMQ 官网上提供了 6 中工作模式:简单模式、工作队列模式、发布/订阅模式、路由模式、主题模式 和 RPC 模式
- rabbit有哪些应用场景?你们使用的场景?
- 多个消费者同时消费应该消息会不会有问题?
- rabbit消息会不会丢失?如果丢失怎么处理?
- 消息会不会被重复消费?
MongoDB
- mongodb基本使用
算法&设计模式
- 常见设计模式 单例 工厂 代理 策略 装饰器
- 设计原则
- 常见算法 冒泡排序 选择排序 插入排序 快速排序 二分法查找
- 常见数据结构 单链表 双链表 队列 堆栈 二叉树 B树
- 链表、双向链表的数据结构
- 冒泡排序,快速排序,二分查找等算法
安全
- xss crsf ddos
- sql注入原理及防御
- web安全预防
- cookie session安全
- 你们保存session的方案?
工作态度
- 你做的最出色的项目,出色在什么地方?
- 你最不满意的地方是哪里?为什么?
- 你最擅长的技术是什么?
- 你碰到过的最大的难题,怎么解决的?
- 你与90/80后的后相比,优势在哪里?1 代码规范 2 工作经验 3 工作态度 4.代码架构,分层思想 5.高内聚低耦合 6易于扩展
- 离职原因
- 职业规划
- 对公司的了解
- 你为什么来本公司
- 你为什么胜任这个岗位
大数据&架构
如果有一个广告系统访问日志,有1000万条记录,现在需要对日志信息做统计,你会采用哪些处理方法?
oltp,olap
cap定律,base理论
怎么处理并发?怎么设计秒杀方案?抢红包?
12306抢票设计
投票
其他
- 给你256M的内存,对10G的文件进行排序(文件每行1个数字),如何实现?
- 假如你现在是12306火车订票的设计师,你该如何设计满足全国人民订票?
- PHP在2011年底出现hash碰撞,hash碰撞原理为?如何进行修复?
- 项目经验 – 是否有亮点的模块? 模块是否自己设计? 设计是否合理? 是否考虑多种设计? 是否考虑性能? 核心算法是否能说的明, 写的出? 很重要
- 一个网页从服务器到客户端都经历了什么
- 在团队中自己是个什么位置之类的问题
- 自己独立做过什么成熟的产品吗
- 你写代码有多长时间了,有没有做过开源项目
- 你如何理解的面向对象编程(什么是面向对象)
- PHP为什么不安全。主要有那些安全问题
- 业务和性能冲突的时候你会怎么办
- 开发过程中你觉得最难的是什么
- 你觉得你和其他人比你的优势是什么
- 如何对一个亿级数据的表按照一个没有索引的字段进行统计
- 考察他对项目核心数据结构/算法的设计, 可结合大数据/高并发/分表分库/分布式服务/分布式事务方面去考察, 可发散到该领域通用问题解决(如树形存储/sku/秒杀系统等设计), 分布式理论与实践 – 考虑他对分表分库/分布式事务/均衡负载/分布式session/分布式cache/soa的经验, 很重要
管理
- 员工离职率
- 员工不愿意加班怎么办?
- 假如你带领着一个技术团队做任务,但该任务无法按照进度完成,你会如何解决?
- 如果领导在现阶段进度已经排满的前提下,又插入任务,你会采取怎样的措施,保证总进度不延期?
- 如果你后期要带领一个团队,团队中有部分工程师当天预定的任务没有完成,你会如何处理?
缓存
- 使用哪些缓存
- 缓存的作用
- 缓存穿透的含义与解决
- 缓存雪崩的含义与解决
- 使用缓存来实现分布式锁/外部锁
- 在抢购商品场景下,一个商品下限制一个用户只能购买一次,请使用缓存来实现该限制(提示:使用缓存来记录每个商品的抢购的用户,要保证增量记录的原子性)
说一下
- 说一下什么是cdn
- 说一下mvc的含义
- 说一下orm的含义与实现
- 说一下路由的含义与实现
- 说一下orm中关联查询的延时加载的放大问题
- 数据层:分表分库是什么?如何拆分?分布式事务如何解决?
- 是否了解soa架构? 说一下你的理解
- 根据项目中涉及到的问题, 考察某类问题的设计思路, 如下
- 说一下购物车的实现
- 说一下订单表的实现
- 说一下存储树形结构的几种方式, 说一下每种方式在修改与查询上的优势与劣势
- 说一下权限系统的实现
- 说一下sku的实现
- 说一下秒杀系统的实现
- 说一下工作流的实现
- 说一下亿级大表的拆分(如订单表)
- 说一下soa的实现
- 说一下分布式事务的实现
- 简述 S.O.L.I.D 设计原则
- PHP7 和 PHP5 的区别,具体多了哪些新特性?
- 为什么 PHP7 比 PHP5 性能提升了?
- 简述一下 PHP 垃圾回收机制(GC)
- Redis、Memecached 这两者有什么区别?
- 什么是IOC
- 微服务的概念
- 说一下RPC
- 说一下Docker、K8s
前端
- Doctype的作用。
- 如何隐藏超出对象部分的内容。
- Name,ID有什么区别。
- 怎么使用jq,jq如果要是和其他类库冲突怎么办?
- charset=utf-8一般写在html什么位置?
- 客户端的对象资源缓存问题。
- 如何隐藏一个对象。
- Js url怎么传递中文?
- http的header里面有哪些东西?
- 习惯使用什么工具作为前端调试?
- 举例说说IE和其他浏览器几个不兼容的地方。
- Ajax的使用。
- 会不会SEO