前言
这是本人在北漂期间面试遇到的所有面试题(面试+笔试),地道纯真,如假包换!
一、Mysql系列
1、主键索引和唯一索引的区别
- 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
- 唯一性索引列允许空值,而主键列不允许为空值。
- 一个表最多只能创建一个主键,但可以创建多个唯一索引。
2、mysql的几种索引类型
- 主键索引
- 唯一索引
- 组合索引
- 全文索引
3、组合索引的最前缀规则
例如设置组合索引(A、B、C)
就相当于设置了A,AB,ABC三个索引。
4、mysql索引失效的几种场景
- 遵循mysql最左侧匹配选择
- 不要在索引列上做任何操作(比如使用CONCAT等函数)
- 使用模糊搜索,百分号必须放在后边
- !=或<>也不会走索引
- 字符串索引必须加引号
5、常见的几种mysql优化
- 避免使用select *
- 在合适的字段建立索引, 不是索引越多越好,索引多了反而占磁盘容量。
- 只查询一条已知数据的话,如果该字段不是索引,可以使用limit来提高速度。
- 避免子查询,尽量使用join。
6、mysql主从同步原理
master的所有操作会记录到binlog日志里,slave有一个SQL线程和一个IO线程,IO线程请求binlog日志并写入到relay-log日志中,在通过SQL线程读取relay-log日志,并解析成实际操作,从而达到数据统一。
7、InnoDB和MyIsAM的区别
-
InnoDB支持事务,MyISAM不支持。
-
InnoDB支持外键,而MyISAM不支持。
-
InnoDB读写速度相对于MyISAM较慢。
-
InnoDB支持行锁,而MyISAM只支持表锁。
8、mysql和mongodb的区别
二、Redis系列
1、redis常用的几种数据类型
- 字符串(键值对)
- hash(哈希)
- list(队列)
- set(集合)
- zset(有序集合)
2、redis和memcache的区别
- redis不光支持键值对,还能够支持其它数据类型(list、hash等)。
- redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis支持数据的备份,即主从同步。
3、缓存雪崩 缓存穿透 缓存击穿
缓存雪崩
原因:设置的缓存在同一时间失效,直接将所有请求打到数据库。
解决:设置不同时长的失效时间,设置多级缓存,例如本地缓存作为一级,redis作为二级。
缓存穿透
原因:缓存穿透表示查询一个一定不存在的数据,由于没有获取到缓存,所以没写入缓存,导致这个不存在的数据每次都需要去数据库查询,失去了缓存的意义。
解决:过滤负数等参数,将空记录也记录到缓存中
缓存击穿
原因:某个key的缓存非常热门,有很高的并发一直在访问,如果该缓存失效,那同时会走数据库,压垮数据库
解决:让该缓存的key永不过期
三、php系列
1、php是弱类型语言还是强类型语言?
- php是弱类型语言
- php相较于C或Java,不区分数据类型,例如,字符串能当整形使用。
2、php常用的几个函数
字符串函数
isset
判断变量是否存在
数组函数
array_values
获取数组的值
array_keys
获取数组的所有键
array_key_exists
判断数组的键是否存在,存在返回1,不存在返回空。
in_array
查看参数一(value),是否存在参数二(数组)里。
array_column
获取数组中的某个键的value值。
array_serach
判断数组中某个值是否存在,存在返回1,否则返回空。(仅限一维数组)
array_diff
$arr = [
0 => '万达广场',
2 => '大明湖',
3 => '趵突泉',
5 => '大明湖',
];
$resultArr = array_diff($arr, ['大明湖']);
print_r($resultArr);die;
输出:
array_unique
去除数组中重复的元素,仅一维数组。
$arr = [4,2,2,6,8,9,6,5,7,8,7];
print_r(array_unique($arr));
输出:
array_count_values
获取数组中每一个值出现的个数,自动过滤重复数据,并将值作为数组的键来使用。
$arr = [4,2,2,6,8,9,6,5,7,8,7];
$arr = array_count_values($arr);
print_r($arr);
输出:
3、swoole和workman的区别
- swoole纯C编写,不依赖于其它任何扩展,性能更强悍。
- workman纯php编写。
4、php常用的几个扩展
- file_info
- curl
- soap
- pdo_odbc
- redis
5、php7的新特性
- 标量类型与返回值类型声明
- 合并的三目运算符
- 常量数组,5.7之前只能通过const定义,7之后可以通过define定义
6、include 和 require的区别
- include有返回值,包含一个文件,如果文件不存在的话会提示,程序会继续执行下去。
- require没返回值,包含一个文件,如果文件不存在,则中止执行。
7、session和cookie的区别
- session存在服务端,cookie存在客户端。
- session安全,cookie不安全。
- session多了也占用服务器性能,建议把重要的 东西存入到session,不重要的东西存入到cookie。
- 关于session id:服务器首先检查客户端中的请求是否携带session id,如果携带,服务器就通过该session id将session直接检索出来使用。如果没携带,则为此客户端创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。
8、php fpm原理
- 关于cgi和fast-cgi协议
早期webserver只处理静态文件,但是随着技术的发展,出现了php等动态语言,webserver处理不了。
有了php解释器,就能对解释php语言了。
但是,php解释器与webserver如何进行通信呢?
这时,诞生了cgi协议。
webserver每收到一个请求,就会fork一个cgi进程,等请求结束后,在fork掉此进程。这样如果要有1万个请求,那就要fork、kill1万次,造成资源的浪费。
于是,就诞生了cgi的加强版,fast-cgi!
fast-cgi每次处理完请求后,不会kill掉此进程,而是保留掉该进程,使得这个进程可以处理多个请求。
这样就不用每次都要fork、kill一个进程了,大大提高了效率。
- 关于fpm
php-fpm(php-Fastcgi Process Manager)
php-fpm是 FastCGI 的实现,并提供了进程管理的功能。
进程包含 master 进程和 worker 进程两种进程。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
9、设计模式的六大原则
单一职责原则
实现类要职责单一
里氏替换原则
不要破坏继承体系
依赖倒置原则
要面向接口编程
接口隔离原则
在设计接口的时候要精简单一
迪米特原则
要降低耦合
开闭原则
要对扩展开放,对修改关闭。
10、php中双$$的含义
$$
标识为可变变量,变量名可动态设置与使用。
$name = 'tom';
$tom = 'my name is tom';
echo $$name;
php将$$name
解析成为了$($name)
,也就是$tom
。
四、Linux系列
1、Linux中的常用的几个命令
cp
cp 文件名 路径
mv
mv 文件名 路径
touch
touch 文件名
cat
cat 文件名
cd
cd 目录路径
pwd
查看当前所在路径
mkdir
mkdir 目录名
rmdir
rmdir 目录名
rm
rm 文件名
ll
查看当前目录下的所有文件
2、Linux查看内存命令
- top
查看内存使用状态
- free
查看内存使用情况
3、Apache和Nginx的优缺点
nginx轻量级,比apache占用更少的内存及资源,抗并发
nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。
rewrite比nginx 的rewrite 强大,少bug,稳定。(抗并发求性能用nginx,求稳定就apache)。
4、Linux安装php扩展通用步骤
- 下载安装包,解压后,cd到该目录。
- 执行命令:./configure --with-php-config = 你的phpconfig路径。
- 执行make install
- 打开php.ini配置文件,新增extension=安装好后的.so文件。
- 重启服务
- php -m查看是否安装成功
5、Linux压缩解压命令
- zip系列:
压缩:zip 压缩包名 文件名
解压:unzip 压缩包名
- tar系列:
压缩:tar czvf 压缩包名 文件名
解压:tar zxvf 压缩包名
五、网络协议系列
1、http和https的区别
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
- http和https使用的端口不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;https协议是由SSL/TLS+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
2、常用的端口
3306
:Mysql8080
:tomcat6379
:redis21
:ftp22
:ssh1521
:Oracle
六、高并发、攻击及优化系列
1、如何处理负载、高并发
- HTML静态化
- 图片服务器分离
- 减少下载,分发到多个镜像端
- 负载均衡
- 数据库集群及缓存
2、XSS和CSRF
- XSS(Cross Site Scripting):跨站脚本攻击
恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的。
- CSRF(Cross Site Request Forgery):跨站请求伪造
通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下的操作。
3、常见的HTTP状态码
1xx:通知
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务端错误
- 400(Bad Request ):客户端请求的语法错误,服务器无法理解。
- 402(Forbidden):服务器拒绝访问。
- 404(Not Found):表示服务器上无法找到请求的资源。
- 500(Inter Server Error):表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误。
- 502(Bad Gateway):服务器网关错误。
七、前端系列
1、如何解决跨域
- jsonp
- 后端代码添加响应头
- Nginx代理增加跨域配置